2013-03-22 52 views
3

也許這是我,但我想知道這種(奇怪的)行爲。爲什麼GC未收集未引用的對象?

考慮下面的代碼片段,這是用於說明效果的最小控制檯程序。

class MyClass { } 

class Program 
{ 
    static void Main(string[] args) 
    { 
      var x = new MyClass(); 
      var y = new MyClass(); 

      x = null; 
      GC.Collect(); 

      Console.ReadKey(); 
    } 
} 

當程序暫停對一個按鍵(或也通過放置一個斷點),存儲器探查表明仍有引用兩個「MyClass的」實例。

GC.Collect()沒有幫助,也沒有將程序作爲「發佈」運行。

應該儘快收集未引用的MyClass實例,至少通過強制GC收集?

注意:較大的控制檯應用程序涉及一堆產生數據的線程,而MyClass類實例充當消費者。這些實例通過WeakReference引用,但似乎這不是問題。問題是我無法通過在Main方法中運行我的所有測試生命週期來垃圾消費者。

在此先感謝。

+0

您是否嘗試過使用'GC.WaitForFullGCComplete();'? GC可能以非阻塞模式異步運行 – 2013-03-22 11:27:34

+0

和'GC.WaitForPendingFinalizers()' – 2013-03-22 11:28:58

+0

對於你們,我嘗試了很多GC模式,包括建議的Collect-WaitForPendingFinalizers-Collect,但沒有任何結果。 如果有人可以嘗試相同的話,我很樂意,因爲我正在認真思考我的平臺上的一些問題...... – 2013-03-22 11:34:16

回答

1

GC.Collect();並不保證立即完成,它會啓動一個後臺線程並立即返回,因此時間分析器檢查它,它可能不會被收集。

1

GC.Collect()異步運行。 In order to run it synchronously您需要撥打:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
+0

結果是一樣的。 – 2013-03-22 11:37:57