你如何保护自己免受失控的内存消耗降低PC?

时间:2010-06-11 17:12:46

标签: .net windows clr

我不时地发现自己做了一些中度愚蠢的事情,导致我的程序分配了它可以获得的所有内存,然后是一些。

这种事情曾经导致程序以“内存不足”错误相当快地死亡,但是现在Windows会不顾一切地将这种不存在的内存提供给应用程序,事实上是显然准备自杀这样做。当然不是字面上的,但是它会使可用的物理RAM非常糟糕,甚至运行任务管理器也需要半小时的交换(在所有失控的应用程序仍在分配越来越多的内存之后)。

这种情况不会经常发生,但是当它发生时却是灾难性的。我通常不得不重置我的机器,导致数据不时丢失,并且通常会带来很多不便。

你是否有任何关于使这种错误的后果不那么可怕的实用建议?也许某些注册表调整限制允许应用程序分配的最大虚拟内存量?或者某些CLR标志仅限于当前应用程序? (我通常在.NET中对自己这样做。)

“不要用完RAM”“购买更多内存”没用 - 前者我无法控制,后者我'已经完成了。)

5 个答案:

答案 0 :(得分:8)

每当您运行有风险的应用时,您都可以保持命令提示符处于打开状态。然后,如果它开始失控,您不必等待任务管理器加载,只需使用:

taskkill /F /FI "MEMUSAGE ge 2000000"

这将(理论上)使用超过2GB的内存强行杀死任何东西。

使用taskkill /?获取所需选项的完整列表。

编辑:更好的是,每隔几分钟将命令作为计划任务运行。任何开始爆炸的过程都会自动消失。

答案 1 :(得分:7)

您可以执行以下操作:限制流程的工作集大小。将其粘贴到Main()方法中:

#if DEBUG
      Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(256 * 1024 * 1024);
#endif

这限制了您的进程可以声明的RAM量,从而阻止其他进程完全被换出。

你可以做的其他事情:

  • 添加更多内存,这些天没有理由不至少有3 GB。
  • 对您的分页文件进行碎片整理。这需要首先对磁盘进行碎片整理,然后使用SysInternals的pagedefrag实用程序对页面文件进行碎片整理。

特别是后一种维护任务在旧机器上很重要。碎片页面文件可能会极大地恶化交换行为。 XP机器上常见的,以前从未进行过碎片整理,并且有一个允许填充的小磁盘。页面文件碎片导致大量磁头搜索,严重影响了另一个进程可以在合理的时间内将自身交换回RAM的几率。

答案 2 :(得分:4)

显而易见的答案是在虚拟机中运行您的程序,直到测试到您确信这些事情不会发生为止。

如果您不喜欢这样的开销,那么就有一些中间立场:您可以在作业对象中运行该进程,并在该作业对象使用的内存上设置限制。

答案 3 :(得分:1)

在Windows中,您可以使用Job Objects

控制流程的属性

答案 4 :(得分:0)

在这种情况下,我通常使用任务管理器在机器运行内存之前终止进程。即使机器开始分页也很糟糕,TaskMan运行得很好。之后,机器通常会恢复。 Windows的后续版本(例如7)在这些情况下通常比早期版本具有更高的生存能力。在没有DWM的情况下运行(在Vista和7中关闭Aero主题)通常也会有更多的时间来调用taskman来监控并可能扼杀失控的进程。