2010-05-06 132 views
18

我需要重構我的項目以使其免於OutOfMemory異常。如何模擬OutOfMemory異常

有在我的項目,並通過改變一個參數,我可以讓我的計劃,以更準確或使用較少的內存使用巨大的收藏品...

OK,這是背景。我想要做的是在循環中運行例程:

  1. 使用默認參數運行子例程。
  2. 捕獲OutOfMemory異常,更改參數並嘗試再次運行它。
  3. 做第二點,直到參數允許運行子例程而不引發異常(通常,只需要一個更改)。

現在,我想測試它。我知道,我可以自己拋出OutOfMemory例外,但我想模擬一些真實情況。

所以今天的主要問題是:
有沒有設定某種形式的內存限制我的程序的方式,達到其OutOfMemory異常將被自動拋出後?
例如,我想設置一個限制,假設我的整個程序有400MB的內存來模擬系統中存在如此大量內存的情況。
可以這樣做嗎?

回答

2

我想建議的看着這個法子。你不一定要耗盡內存。您只需要監視所使用的內存量,並將其與總系統內存進行比較。也許像GC.GetTotalMemory這樣的東西可以用來查看你的應用程序使用了多少內存。然後perhaps this article將有助於獲取系統上可用的物理RAM總量。

+0

嗯,我甚至不需要將它與系統內存進行比較,我只需要知道我的程序使用了多少MB的RAM。我需要閱讀GC的文檔...謝謝! – Gacek 2010-05-06 15:47:01

+0

好的...既然你在尋找OutOfMemoryException,我想你爲了達到最佳性能的目的而在某個時間點用完了。但是,嘿,如果GC方法適合你,很酷! – Dave 2010-05-06 15:51:26

+0

嗯,我想我可以使用GC方法並在達到一定限度後自行拋出異常。也許一些背景工作者......我需要測試它是否會起作用。 – Gacek 2010-05-06 15:55:04

5

只分配一個非常大的數組。一旦C#應用程序的內存使用量達到1.2-1.6GB(通常在該範圍的較低端,提供目標x86),您很可能會開始發生內存異常。除非你有RAM :)的12GB

+0

好的,但我可以通過拋出OutOfMemory異常來獲得相同的結果。我想模擬真實情況並使用一些小數據集(消耗大約400MB RAM而不是1.6GB)來測試它 – Gacek 2010-05-06 15:40:30

+0

這在64位上無法可靠運行。 – Thorsten79 2010-05-06 15:42:19

+0

更好的是,開始構建數組,每個數組長度爲1GB。你將能夠很快地重現它。 – Nayan 2010-05-06 16:22:32

6
public void EatMemory() 
{ 
    List<byte[]> wastedMemory = new List<byte[]>(); 

    while(true) 
    { 
     byte[] buffer = new byte[4096]; // Allocate 4kb 
     wastedMemory.Add(buffer); 
    } 
} 

不宜長時間

+3

Om nom nom! Windows將應用程序限制爲x86上的2GB內存,我認爲它在64位上略高一些,所以12GB無關緊要。 – NibblyPig 2010-05-06 15:39:08

+0

有意思的是,我運行了上面的代碼,並且很好地編寫了我的PC。 Windows完全沒有響應,最終我到任務管理器使用3GB內存來查看Visual STudio。我沒有得到任何例外,內存使用量持續上升至約3.1GB,然後跳回到3GB ......我有4GB RAM。 – NibblyPig 2010-05-06 15:46:52

+0

@SLC:頁面文件可能保護你免受這種情況的侵害,當你注意到你的電腦慢慢爬行時,它可能會被啓動。 – Dave 2010-05-06 15:52:19

16

這看起來像一個工作... System.Runtime.MemoryFailPoint

http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

我想在鏈接的例子符合你的情況。將MemoryFailPoint設置爲您需要的任何級別,然後捕獲InsufficientMemoryException並相應地調整輸入參數。

+0

看來,這個類與我所需要的完全相反。它實際上檢查是否有一定量的內存可用(例如,調用MemoryFailPoint(100)'可以檢查是否可以執行100MB的操作。我需要的是檢查我的程序已消耗了多少內存。 – Gacek 2010-05-06 18:18:53

2

模擬內存不足異常的好方法是在虛擬機(VM)中運行程序。您可以將虛擬機的最大內存分配設置爲足夠小的級別,以便在程序上創建內存壓力並引發異常。

一些開源虛擬機是:QEMU,xenkvm。 好的商用虛擬機是VMware Fusion for Mac OS X或VMware Player for Linux/Windows。

2
string value = new string('crazy', int.MaxValue);