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

Rom*_*kov 12 .net windows clr

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

这种事情曾经导致程序因"内存不足"错误而很快死亡,但是现在Windows会不顾一切地将这种不存在的内存提供给应用程序,事实上显然已经准备好自杀这样做.当然不是字面意思,但它会使可用的物理RAM匮乏如此严重,甚至运行任务管理器将需要半小时的交换(在所有失控的应用程序仍在分配越来越多的内存之后).

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

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

("不要耗尽RAM""购买更多RAM"是没有用的 - 前者我无法控制,后者我已经完成了.)

dmb*_*dmb 8

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

taskkill /F /FI "MEMUSAGE ge 2000000"
Run Code Online (Sandbox Code Playgroud)

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

使用taskkill /?得到它需要选项的完整列表.

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


Han*_*ant 7

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

#if DEBUG
      Process.GetCurrentProcess().MaxWorkingSet = new IntPtr(256 * 1024 * 1024);
#endif
Run Code Online (Sandbox Code Playgroud)

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

你可以做的其他事情:

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

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