什么是.NET应用程序的合理内存量?

时间:2008-12-02 14:51:07

标签: memory clr

我有一些抱怨,我们的托管应用程序之一正在使用20-25Mb的RAM。我通常会回过头来说内存很便宜;克服它。

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

10 个答案:

答案 0 :(得分:7)

20-25MB没什么。

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

答案 1 :(得分:4)

这个问题就像问“你能把多少苹果放进房间”......

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

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

当您回答这些问题时,可以提供粗略估算值。虽然知道甚至连.Net上的“Hello World”应用程序(以及Java也是如此)都可以占用几KB到几百TB之间的任何理论(理论上),因为GC的构造主要是为了让它们分配得很好。根据可用内存量,池中有大量内存。因此,在稀缺的内存计算机上,.Net WinForms应用程序可能会在具有大量可用内存的系统上占用少量资金(理论上)太字节即使对于“Hello World”......

答案 2 :(得分:4)

这是非常合理的,是的。分配更多内存比通过GC更频繁地试图保持堆大小减少更便宜。

答案 3 :(得分:3)

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

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

答案 4 :(得分:3)

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

然后,我对应用程序做了一些相当内存密集的工作,私有工作集达到了28MB。然后我切换到另一个内存密集型应用程序,并且看到我的私人工作集现在是8MB,尽管事实上没有释放内存。

应用程序使用RAM非常难以测量,更难以确定是否有任何内存使用“太多”(当然,除了某些内容之外)。

除非您的客户使用经过仔细考虑的性能计数器测量来指示各种类型的内存使用,否则您实际上并不知道您的应用在其计算机上使用了多少内存。

根据客户的技术知识,你真的没有内存问题,这是一个潜在的棘手的通信问题。但RAM很便宜听起来有点翻转,可能不是你最好的方法。

答案 5 :(得分:2)

这取决于应用程序正在做什么。 20 - 25Mb听起来不像我。

我刚刚创建了一个非常简单的Windows窗体应用程序,其中很少,并且需要19 - 20Mb。 我假设这可能是.NET表单应用程序所需的最小内存量。

答案 6 :(得分:2)

不,这完全是令人发指的。你称自己为程序员?我的上帝,伙计。当我开始时,我可以在一张打卡上放入十五个应用程序(我必须使用一对生锈的脚趾甲剪,btw)。它们都在十五个CPU周期内完成,实际上是无中生有的内存。

你应该被淹没。马上辞职。

答案 7 :(得分:1)

你正在做什么?是否有理由使用大约20部全长小说的记忆?这肯定是你的应用程序,而不仅仅是.net运行时开销?有问题的机器内存不足吗?它会降低性能吗?

那个和一千零一个问题是你需要回答的问题:)我个人认为这是一个非常大量的内存......但是我在手机上工作,其中20mb是我能得到的最多作为最大堆大小:)

答案 8 :(得分:1)

如果您的用户使用任务管理器检查应用的内存使用情况,则可能是他们正在查看内存使用情况列。正如Stephen Martin所说,这是误导性的,因为该专栏实际上显示了应用程序的完整工作集。这由以下内容组成:

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

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

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

答案 9 :(得分:0)

如果你因应用程序的内存占用而反复引起眉毛抬起,你至少应该看看你是否确实需要这个数量,或者只是累积效率低下。减少内存占用通常也会带来速度提升,从而提高客户的幸福感。通常,这种抱怨也可能暗示其他低效率,从用户的角度来看,这看起来有点膨胀。