2013-07-10 77 views
3

我有一段糟糕的時間,C#沒有釋放內存,因爲我沒有再引用它,因此我在內存中保留了一個大的結構。C#GC沒有釋放內存

我已經在下面列出了一些代碼,展示了一個類似的問題,我有一個。我想我一定是誤解了一些GC,因爲我不確定爲什麼下面的代碼會拋出一個內存異常。

有誰知道我爲什麼包含的代碼會導致內存不足?沒有任何名單正在舉行,他們立即可以清理。

感謝,

保羅

攝製:全新的4.5控制檯應用程序,將代碼粘貼到主。

異常將在for循環的第一次迭代中拋出在第三個「新列表」上。如果省略for循環,則不會出現OOM。

for (var i = 0; i < 100; i++) 
{ 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
    new List<int>(100 * 1000 * 1000); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, blocking: true); 
} 
+0

在你的真實程序中,你使用GC嗎?你應該嘗試讓程序儘可能地做自己的gc – Sayse

+0

這裏只是我的看法,但是如果你需要做大量細粒度的內存管理和GC,C#可能不適合這項工作。類似於C/C++可能更適合。 – Gray

+0

以下哪一行會引發異常?第一個還是另一個? –

回答

2

行,這並再現,但只有在下列條件下:

  • Fx的4.5,平臺=任何CPU,配置=調試。

通過選擇x64平臺或發佈模式,程序按預期運行。

因此,試探性的結論是:在沒有優化的情況下,List<>仍然紮根於他們不應該在的地方。所以GC調用完全沒有效果,x86內存空間很快耗盡。

這可能是一個錯誤,或者它可能是一個旨在調試的'功能'。

雖然似乎有問題,但很容易避免。

+0

不幸的是,即使選擇了發佈模式,我仍然遇到錯誤。 – skippy10110

+0

可以肯定,是[]優化檢查? –

+0

我相信這實際上是一個與調試有關的「特徵」,但我不是100%肯定的。我讀到一個很棒的答案,我回想起來,不久前我解釋了類似的東西,我會盡力找到答案(實際上,我最初認爲你寫了答案,也許不是。)當然,如果答案是正確的,它發生在一個優化的構建...這是錯誤的。 –