CLR内存消耗问题

fit*_*thu 5 .net clr performance

CLR的一个问题是在缺少RAM时出现非常糟糕的行为(当托管进程的某些内存被调出时,这会导致整个系统完全冻结,甚至无法访问Ctrl-Alt-Del屏幕我假设原因是GC尝试构建可到达对象的图形并尝试扫描进程的所有内存,从而导致大量页面/页面输出操作).
这对我的.NET程序来说是一个问题,因为当输入数据很大时它会消耗大量的RAM.

我宁愿向用户显示"内存不足"的消息,而不是完全挂起他的系统^ _ ^
有没有办法实现这一点?

Pie*_*kel 3

使用MemoryFailPoint,您可以告诉 .NET 您将需要一定量的内存。但问题是,即使这个系统也包含交换空间。

我相信在这里达到你想要达到的目标是非常困难的。比如说,您将使用一些系统指示器和性能指示器来找出有多少物理内存可用,并基于此执行一些任务。如果完成此检查后,另一个进程进入抢占物理内存,则您原来的计算不再适用,并且您的一些内存将被推送到交换。

我确实有一个建议。您可以有一个配置设置,其中包含应用程序允许使用的最大内存量?有了这个,您可以:

  1. 尝试根据网络连接(如果您的应用程序是网络服务器)等计算出您的应用程序消耗了多少资源,并根据最大内存消耗限制连接数量,或者

  2. 您可以运行第二个线程,每隔 10 秒或每分钟检查一次总内存消耗,并GC.GetTotalMemory()在达到该最大值后开始拒绝连接(同样,如果您的应用程序是网络服务器)。

这应该是一个配置设置,而不是可用物理内存量等,因为您不知道计算机上正在运行哪些其他应用程序。