Dot-Net

您如何保護自己免受記憶體消耗失控而導致 PC 崩潰?

  • August 31, 2010

時不時地,我發現自己在做一些相當愚蠢的事情,導致我的程序分配它可以獲得的所有記憶體,然後分配一些記憶體。

這種事情過去常常導致程序因“記憶體不足”錯誤而很快死掉,但現在 Windows 會竭盡全力為應用程序提供這種不存在的記憶體,實際上顯然準備好了這樣做自殺。當然不是字面意思,但它會嚴重耗盡可用的物理 RAM,以至於即使執行任務管理器也需要半小時的交換(畢竟失控的應用程序仍然一直在分配越來越多的記憶體)。

這種情況不會經常發生,但一旦發生,那就是災難性的。我通常必須重置我的機器,不時導致數據失去,通常會帶來很多不便。

你有什麼實用的建議可以讓這種錯誤的後果不那麼可怕嗎?也許一些系統資料庫調整來限制應用程序允許分配的最大虛擬記憶體量?或者某些 CLR 標誌只會限制目前應用程序?(我通常在 .NET 中對自己執行此操作。)

(*“不要用完記憶體”“購買更多記憶體”*沒有用 - 前者我無法控制,後者我已經完成了。)

每當您執行有風險的應用程序時,您都可以打開命令提示符。然後,如果它開始失控,您不必等待任務管理器載入,只需使用:

taskkill /F /FI "MEMUSAGE ge 2000000"

這將(理論上)強制殺死使用超過 2GB 記憶體的任何東西。

用於taskkill /?獲取所需選項的完整列表。

編輯:更好的是,每隔幾分鐘將命令作為計劃任務執行一次。任何開始崩潰的程序都會被自動終止。

您可以做一些事情:限制程序的工作集大小。將此粘貼到您的 Main() 方法中:

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

這限制了您的程序可以要求的 RAM 數量,從而防止其他程序完全換出。

您可以做的其他事情:

  • 添加更多 RAM,這些天沒有理由沒有至少 3 GB。
  • 對頁面文件進行碎片整理。這需要首先對磁碟進行碎片整理,然後使用 SysInternals 的 pagedefrag 實用程序對頁面文件進行碎片整理。

尤其是後者的維護任務對舊機器很重要。碎片化的頁面文件會極大地惡化交換行為。在以前從未進行過碎片整理的 XP 機器上很常見,並且有一個允許填滿的小磁碟。頁面文件碎片導致大量磁碟磁頭尋軌,嚴重影響了另一個程序可以在合理的時間內將自身交換回 RAM 的機率。

引用自:https://stackoverflow.com/questions/3024769