2010-06-11 16 views
12

我每時每刻都會發現自己做了一些適度愚蠢的事情,導致我的程序分配了可以獲得的所有內存,然後分配了一些內存。你如何保護自己免受暴風影響的內存消耗降低PC?

這種事情會導致程序很快就會因爲「內存不足」錯誤而死亡,但是現在Windows將無法爲應用程序提供這種不存在的內存,事實上,顯然準備自殺。當然不是,雖然運行任務管理器需要半個小時的交換時間(在所有失控應用程序仍然分配越來越多的內存之後),否則它會使可用物理內存嚴重匱乏。

這並不經常發生,但是當它發生時是災難性的。我通常不得不重置我的機器,導致數據時常丟失,並且通常會帶來很多不便。

對於使這種錯誤的後果不那麼可怕,您有任何實際的建議嗎?也許一些註冊表調整來限制應用程序允許分配的最大虛擬內存量?或者一些CLR標誌只會限制當前的應用程序? (它通常是在.NET中,我這樣做是爲了我自己)

「不要跑出來的RAM」「購買更多RAM」是沒有用的 - 前者我沒有控制權,而後者我已經完成了。)

+1

+1,我一直想問這個問題一段時間。當它不是我的應用程序時,情況更糟,我無法點擊「停止」。 – zildjohn01 2010-06-11 17:20:25

+0

當我感覺像這樣出現錯誤時,通常我會快速地殺死我的應用程序。但是,考慮解決方案而不是僅僅靠這種「危險」來生活。也許有一些調整,這將不勝感激! – zerm 2010-06-11 17:25:23

+2

我從來沒有見過失控的內存消耗降低了PC的性能,但是如果這樣做的話,那麼我希望它在開發或質量保證期間這樣做,以便我們解決問題;或者如果它發生在生產中,我希望我們的操作人員會殺死/轉儲過程並通知我。 – 2010-06-11 17:28:42

回答

8

你可以保持一個命令提示符打開,只要你運行一個應用程序的風險控制過程的屬性。然後,如果它開始失控,你不必等待任務管理器來加載,只需使用:

taskkill /F /FI "MEMUSAGE ge 2000000" 

這將超過2GB的內存使用更多的(理論上)力殺生。

使用taskkill /?可以獲得所需選項的完整列表。

編輯:甚至更好,每隔幾分鐘運行命令作爲計劃任務。任何開始爆炸的進程都會自動啓動。

+0

與調度的明智的想法,這可能只是伎倆。我不知道taskkill具有強大的過濾功能。 – 2010-06-11 18:27:27

+1

+ 100。這是我的快速啓動欄。 「幾分鐘後」過去了,通常已經太晚了。 – zildjohn01 2010-06-11 18:33:28

+1

只要它不會在一夜之間殺死你的3D渲染...... – 2010-08-31 03:39:21

0

我通常在這種情況下使用任務管理器來殺死機器運行內存之前的進程。即使機器開始非常糟糕地分頁,TaskMan也運行得很好。之後,機器通常會恢復。 Windows(比如7)的更新版本在這些情況下通常具有比早期版本更多的生存能力。在沒有DWM的情況下運行(在Vista和7中關閉Aero主題)通常也會給您更多的時間來調用taskman進行監控,並有可能終止失控進程。

4

顯而易見的答案是在虛擬機內部運行程序,直到經過測試,證明您確信這些事情不會發生。

如果您不喜歡這種開銷,那麼您可以在作業對象內運行該進程,並在該作業對象所用的內存上設置一個限制。

+1

虛擬機將會死亡,如果它發生了,並且因爲這是我一直在開發的地方,我幾乎遭受了所有相同的影響。重新工作的對象:以前沒有遇到過;是否可以設置Visual Studio開始調試「通過」作業對象,如果我可以這樣說? – 2010-06-11 17:39:23

+1

對 - 您必須將其分配給單獨的虛擬機才能獲得更好的性能。我不認爲VS支持將墮落者納入工作對象,儘管它似乎是一個明顯的步驟。 – 2010-06-11 18:01:42

7

您可以執行以下操作:限制流程的工作集大小。粘貼到您的Main()方法:

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

這限制的RAM您的過程可以要求,以防止其他進程從得到完全交換的量。

其他事情可以做:

  • 添加更多的內存,沒有理由不擁有至少3千兆字節的這些日子。
  • 碎片整理您的分頁文件。這需要先對磁盤進行碎片整理,然後使用SysInternals的pagedefrag實用程序對分頁文件進行碎片整理。

特別是後者的維護任務在舊機器上很重要。碎片化的分頁文件可能會嚴重惡化交換行爲。常見於以前從未進行碎片整理的XP機器上,並且允許填滿小型磁盤。分頁文件碎片會導致大量磁盤磁頭尋道,嚴重影響另一個進程可以在合理的時間內將自己交換回RAM的機率。

+0

+1。我認爲你只是將我的測試工作的一小部分簡化爲10倍左右...... – 2010-08-31 03:37:29

相關問題