2009-12-16 52 views
3

我的目標是達到填滿所有可用內存的一個點(請注意,我希望以增量方式執行此操作,因此在最後一次分配之前我只剩下最少的內存)。我怎樣才能做到這一點?C#:用完幾乎所有的內存

+3

解釋你想達到這樣做呢? – 2009-12-16 01:43:10

+0

我認爲他在做實驗。我想知道是否有一個不引發OutOfMemoryException的解決方案不會檢查剩餘的可用內存。 – 2009-12-16 01:55:57

+0

@Jader:你想要一些東西來消耗所有的記憶,而沒有任何手段知道什麼時候發生了? – 2009-12-16 01:59:47

回答

4

一個選擇是創建某種類型的列表,並在一個無限循環中繼續添加垃圾。

雖然這可能需要一段時間,但這可能需要一段時間 - 加速它的一個選項是最初在列表元素中添加大型結構,然後捕獲OutOfMemoryError並以較小的內容再次嘗試,直到得到您需要的精度。

+1

我覺得這種方法可能存在問題。我認爲List <>類每增加一次內部存儲就會增加一倍 - 這意味着在最糟糕的情況下,在拋出異常之前,你只能使用略多於一半的可用內存。我很高興被證明是錯誤的 - 或者這對傑克的情況來說足夠好。 – Ant 2009-12-16 09:09:44

+0

如果鏈接列表在每次增長(甚至是暫時)時都將其存儲需求翻倍,那麼這是最糟糕的鏈表實現。 – 2009-12-16 18:46:41

0

也許這樣的事?

var bytes = new List<byte[]>(); 
var time = new TimeSpan(100); 
while (true) 
{ 
    bytes.Add(new byte[1024]); 
    Thread.Sleep(time); 
} 
0

在while循環中向內存流中添加大緩衝區。

9
for (object[] o = null;; o = new[] { o }); 
+0

如果這真的有效..它是討厭的...:P – 2009-12-16 01:49:40

+0

是的,它的工作原理!事實上,它工作得很好,它使Visual Studio 2008崩潰(在調試器下運行時)。 – EMP 2009-12-16 07:45:14

+0

Pavel Minaev你會介意向我解釋這段代碼的工作原理嗎?我剛剛遇到了這個,並嘗試過,現在我很好奇。 – 2016-01-12 02:30:59

0

的LINQ方式:

Enumerable.Range(0, int.MaxValue).ToArray(); 
+1

除了它失敗或成功,但最有可能失敗分配一個單一的大陣列。 – 2009-12-16 07:27:00

+1

是的,這個在使用完所有可用RAM之前會拋出OutOfMemoryException。 – EMP 2009-12-16 07:46:42

0
 int size = 1024; 
     var bytes = new List<byte[]>(); 
     while (true) 
     { 
      try 
      { 
       bytes.Add(new byte[size]); 
      } 
      catch 
      {     
       if (size == 1) 
       { 
        throw; 
       } 
       size = size/2; 
      } 
     } 
1

你正在談論喜歡它的聲音場景可能是用於測試的應用程序。

您可能想要查看負載/壓力測試工具。 LoadRunner是第一個想到的。它不是「用C#編寫的」,我很確定它不是免費的,但它可能是正確的工具。另外,如果您希望查看的是您的程序如何處理OutOfMemory異常,則可能需要查看故障注入。

對於究竟你問什麼,這裏有消耗內存的應用程序的文章: http://msdn.microsoft.com/en-us/magazine/cc163613.aspx

2
var junk = new LinkedList<byte[]>(); 
int allocSize = 100 * 1024 * 1024; // 100 MiB 
while (allocSize > 0) 
{ 
    try 
    { 
     junk.AddLast(null); 
     junk.Last.Value = new byte[allocSize]; 
    } 
    catch (OutOfMemoryException) 
    { 
     allocSize = (allocSize - 1)/2; 
    } 
} 
相關問題