Memory 什么';一个.NET应用程序的内存量是否合理?

Memory 什么';一个.NET应用程序的内存量是否合理?,memory,clr,Memory,Clr,我有几次抱怨我们的一个托管应用程序使用了20-25Mb的RAM。我通常会回过头来说内存很便宜;忘掉它 这对于Windows窗体应用程序是否合理?这取决于应用程序正在执行的操作。20-25Mb对我来说不算什么 我刚刚创建了一个非常简单的Windows窗体应用程序,上面几乎没有什么内容,花费了19-20Mb。 我假设这大概是.NET窗体应用程序所需的最小内存量。这个问题就像问“一个房间可以放多少个苹果” 首先,我会问“苹果有多大” 然后我会用“房间有多大” 当你回答了这些问题后,就可以给出一个粗略的

我有几次抱怨我们的一个托管应用程序使用了20-25Mb的RAM。我通常会回过头来说内存很便宜;忘掉它


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

这取决于应用程序正在执行的操作。20-25Mb对我来说不算什么

我刚刚创建了一个非常简单的Windows窗体应用程序,上面几乎没有什么内容,花费了19-20Mb。
我假设这大概是.NET窗体应用程序所需的最小内存量。

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

首先,我会问“苹果有多大”

然后我会用“房间有多大”

当你回答了这些问题后,就可以给出一个粗略的估计。尽管我们意识到,即使是.Net上的“Hello World”应用程序(Java也是如此)也可以占用几KBs到数百TB(理论上)之间的任何空间,因为GCs的构造主要是为了根据可用内存的多少来分配池中极大量的内存。因此,在内存不足的计算机上,.Net WinForms应用程序可能占用少量内存,而在具有大量可用内存的系统上,即使是“Hello World”,也可能占用(理论上)TB的内存。…

20-25MB算不了什么


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

这是非常合理的,是的。分配多一点内存比通过更频繁地GCing来降低堆大小要便宜得多。

不,这太过分了。你自称是程序员?天哪,伙计。刚开始的时候,我可以在一张打孔卡上打15个申请表(顺便说一句,我必须用一把生锈的指甲钳打孔)。它们都是在15个CPU周期内完成的,实际上是从无到有地创建了内存


你应该感到羞耻。立即辞职。

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


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

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


这和其他一千多个问题是你需要回答的:)我个人认为这是一个荒谬的巨大记忆量。。。但是我在移动电话上工作,其中20mb是我能处理的最大堆大小:)

它们到底是什么意思?它是工作集、专用工作集、虚拟内存等吗。?我刚刚发布了一个相当简单的.Net应用程序,它占用了21MB的工作集,也就是21MB的内存。但它的私有工作集只有4MB,所以系统和共享库占用了大约17MB的空间,即使我的应用程序没有加载,它们也会被使用

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

一个应用程序对RAM的使用是非常难以衡量的,甚至更难决定任何内存使用是否“太多”(当然,这是不合理的)

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


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

如果你的用户正在使用任务管理器检查你的应用程序的内存使用情况,那么很可能他们正在查看内存使用情况列。正如斯蒂芬·马丁(Stephen Martin)所说,这是一种误导,因为该专栏实际上显示了应用程序的完整工作集。这包括:

  • 私有工作集-驻留页面,仅对您的流程私有
  • 可共享的工作集-驻留页面,可与其他进程共享
  • 共享的工作集-当前与其他进程共享的常驻页面。这是可共享工作集的子集
如果是这种情况,您可以通过手动将应用程序的完整工作集缩减为其私有/共享工作集来玩一个小把戏。这是通过使用Win32 API调用SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1)
完成的。这就是Windows在系统内存不足时所做的,但是c