2

我收到了一些投诉,称我们的一个托管应用程序使用了 20-25Mb 的 RAM。我通常会反驳说内存很便宜。克服它。

这对于 Windows 窗体应用程序是否合理?

4

10 回答 10

7

20-25MB 不算什么。

无论如何,.Net 框架并不总是立即回收 RAM。随着时间的推移,我看到应用程序在“昂贵”的过程中达到了几百 MB RAM 的峰值,然后即使在“昂贵”的过程完成后也只是坐在那里。然而,这是一种误导。该应用程序未使用此 RAM。只是垃圾收集器还没有看到收集大量旧 RAM 的需要。如果操作系统需要该 RAM,请放心,它会被收集。应用程序最多只能使用几百 K 的想法不适用于托管环境——对于操作系统进程,是的。对于本机应用程序,也许。但不是托管代码。否则,您最终只会得到具有完整 GB 或更多 RAM 的系统,而这些 RAM 只是处于空闲状态。

于 2008-12-02T14:55:06.750 回答
4

这个问题就像问“你可以在一个房间里放多少苹果”......

首先我会反问“苹果有多大”......?

然后我会反击“房间有多大”......?

当你回答了这些问题后,就可以给出一个粗略的估计。尽管意识到即使是 .Net 上的“Hello World”应用程序(以及 Java 也是如此)也可以占用几 KB 到几百 TB(理论上)之间的任何内容,因为 GC 主要是构建以便它们分配得很好根据可用内存量,池中的内存量非常大。因此,在内存稀缺的计算机上,.Net WinForms 应用程序可能需要少量内存,而在具有大量可用内存的系统上,即使对于“Hello World”,它也可能需要(理论上) TB ...

于 2008-12-02T14:54:47.267 回答
4

这很合理,是的。分配更多的内存比通过更频繁地 GC 来积极尝试降低堆大小要便宜。

于 2008-12-02T14:55:13.663 回答
3

回击有一个潜在的正当理由:如果您的客户在终端服务环境中使用您的应用程序,并且十几个或更多用户共享 4GB 内存怎么办?将您的 20 - 25 MB 添加到 Outlook 的 30+、IE 的 20+、Word 的 25+ 和 Excel 的 25+,乘以终端用户的数量,希望您能看到他们可能来自哪里。

我认为,在这个时代,20 - 25 MB 是完全合理的。如果你是数百兆,那可能是另一回事。但这都是特定情况的。

于 2008-12-02T14:56:09.370 回答
3

RAM 究竟是什么意思?是工作集、私有工作集、虚拟内存等等等等?我刚刚启动了一个相当简单的 .Net 应用程序,它占用了 21MB 的工作集,即 21MB 的 RAM。但是它的私有工作集只有 4MB,所以即使我的应用程序没有加载,系统和共享库也会占用大约 17MB。

然后,我使用该应用程序做了一些相当消耗内存的工作,私人工作集达到了 28MB。然后我切换到另一个内存密集型应用程序,发现我的私人工作集现在是 8MB,尽管没有释放内存。

应用程序对 RAM 的使用非常难以衡量,更难确定任何内存使用是否“过多”(当然,除了一些令人发指的事情之外)。

除非您的客户使用经过深思熟虑的性能计数器测量来指示各种类型的内存使用情况,否则您实际上并不知道您的应用程序在他们的计算机上使用了多少内存。

您并没有真正的内存问题,您所拥有的是一个潜在的棘手的通信问题,具体取决于客户的技术知识。但是 RAM 很便宜听起来有点颠倒,可能不是你最好的方法。

于 2008-12-02T15:55:02.310 回答
2

这取决于应用程序在做什么。20 - 25Mb 对我来说听起来并不多。

我刚刚创建了一个非常简单的 Windows 窗体应用程序,上面几乎没有,并且占用了 19 - 20Mb。我认为这可能是 .NET 表单应用程序占用的最小内存量。

于 2008-12-02T14:52:42.840 回答
2

不,这太离谱了。你称自己为程序员?我的上帝,伙计。刚开始时,我可以在一张打孔卡上放置 15 个应用程序(顺便说一句,我必须用一把生锈的脚趾甲剪打孔)。它们都在十五个 CPU 周期内完成,实际上是从无到有地创建了内存。

你应该感到羞愧。马上辞职。

于 2008-12-02T14:55:14.940 回答
1

你在做什么?用掉大约 20 本长篇小说的内存是否合理?这绝对是您的应用程序,而不仅仅是 .net 运行时开销?有问题的机器内存不足吗?它会降低性能吗?

那和一千零个其他问题是您需要回答的:) 我个人认为这是一个可笑的巨大内存量......但后来我在手机上工作,20mb 大约是我能逃脱的最多最大堆大小:)

于 2008-12-02T14:57:29.820 回答
1

如果您的用户正在使用任务管理器来检查您的应用程序的内存使用情况,那么他们很可能正在查看“内存使用情况”列。正如斯蒂芬马丁所说,这是一种误导,因为该列实际上显示了应用程序的完整工作集。这由以下部分组成:

  • 私有工作集 - 仅对您的进程私有的驻留页面。
  • 共享工作集 - 可以与其他进程共享的常驻页面。
  • 共享工作集 - 当前与其他进程共享的常驻页面。这是可共享工作集的子集。

如果是这种情况,您可以通过手动将应用程序的完整工作集减少为其私有/共享工作集来玩一些小把戏。这是通过使用 Win32 API 调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1)来完成的。这是 Windows 在系统内存不足时无论如何都会做的事情,但是控制何时发生这种情况可以让您将 .NET 应用程序的完整工作集剥离到其私有/共享工作集。这个数字通常要小得多。

小了多少?将您的应用程序最小化到任务栏会做同样的事情,因此您可以在不更改任何代码的情况下进行检查。

于 2008-12-03T00:53:46.217 回答
0

如果您的应用程序的内存占用一再引起人们的注意,您至少应该看看您是否真的需要这个数量,或者它是否只是累积的低效率。减少内存占用通常也会带来速度的提升,进而提高客户的满意度。通常,这种抱怨还可能暗示其他效率低下,从用户的角度来看似乎有些臃肿。

于 2008-12-03T01:13:43.477 回答