2010-01-05 46 views
3

這可能是我使用託管語言的經驗不足的問題。這個問題本質上是一個對象方法中的一個循環,它在大約20秒內執行,在整個循環過程中,程序整體的內存使用量不斷增加。現在,循環中被修改的所有變量都是在循環範圍內定義的變量(即沒有在循環中更改/重新分配類成員)。整個方法完成後,剩餘內存仍在使用中。垃圾回收未按預期運行

我完全不知道爲什麼/哪裏這個問題,但這裏有一些東西可能是一個因素:

  1. 我用的是循環中的字體,但我.Dispose()'他們與已經證實沒有GDI泄漏。
  2. 我有try/catch語句正在使用中。
  3. 對象被分配...

如此反覆,在哪裏這個問題,可以從未來將是非常有益的任何想法,我會後的代碼,但有不少呢。同樣如上所述,在方法調用完成後,甚至在調用該方法的對象已超出範圍之後,內存不會被清理乾淨。

編輯

我也只是嘗試了GC.Collect的()方法,並沒有在整體結果發生了變化。我不知道,但這是否意味着內存不被視爲'垃圾'?同樣,所有的分配都在循環的範圍內完成,所以不應該在循環終止後被認爲是垃圾。我知道GC不會立即清理它,但使用GC.Collect()調用應該強制這樣做?

+3

*使用託管內存分析器*;這就是它的目的。別的只是猜測。 – 2010-01-05 07:45:04

+0

我最喜歡的C#/。NET管理記憶故事之一是普林斯頓DARPA大挑戰賽團隊http://www.codeproject.com/KB/showcase/IfOnlyWedUsedANTSProfiler。aspx – 2010-01-05 15:42:11

回答

3

.NET使用traced garbage collection而不是classic reference counting機制。

只要.NET代碼釋放一個對象或數據,它就不會立即被清理乾淨。它在清理之前坐了一段時間。垃圾收集器是一個獨立的實體在四處遊蕩。

關於垃圾收集

微軟州但是,內存是不是無限的。 最終垃圾回收器必須 執行收集以釋放 一些內存。

垃圾收集器將根據複雜的算法自行休閒。如果不是在程序生命週期結束時,它最終會清理所有內容。我們不建議我們通過System.GC成員戳垃圾收集器,因爲我們應該認爲它最好。

+0

Ya我覺得它是這樣的,問題是最終我的算法是使用600 Mb的RAM,這是......不可接受的。 – DeusAduro 2010-01-05 06:47:01

0

如果沒有指向它們的指針,垃圾收集器將釋放對象。確保你不要在你的變量中保留不必要的對象(特別是在數組中)。