2012-09-21 182 views
3

我試圖通過在析構函數中使用console.WriteLine()來確保釋放某個類的實例,但輸出永遠不會顯示出來。GC.Collect()+ GC.WaitForPendingFinalizers()是否不回收所有可回收的內存?

我仔細搜索了任何延遲的引用,以及事件訂閱,沒有找到任何。只是我自己的理智,以前我繼續我的搜索,可以有人證實:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 

將迫使一個完整的回收,無論物體有多小?

+1

您需要執行'Collect','WaitFor ...','Collect',否則不能收集可終結對象。 – CodesInChaos

回答

3

一般來說,這應該清理大部分事情。

但是,如果您的終結器中有代碼,則它是possible that you will need to call GC.Collect() twice,因爲第一次會導致終結器執行,但實際內存不能在終結器完成後才被清理,這意味着後續調用將會捕獲目的。

+0

哦。那麼我的搜索將繼續。我會殺死一個GC.GetListOfReferences(對象)命令...似乎它會非常有用! –

+1

@HarryMexican您可以使用SoS獲取調試器中的引用列表,以及許多.NET內存分析器。請參閱:http://stackoverflow.com/q/707421/65358 –

+0

謝謝里德。如果沒有Memory Profiler,我就不會想到它了。注意到ConcurrentQueues儘管是空的,仍然保留引用。然後找到這個:http://blogs.msdn.com/b/pfxteam/archive/2012/05/08/concurrentqueue-lt-t-holding-on-to-a-few-dequeued-elements.aspx 果然,通過系統運行足夠的流量後,ConcurrentQueue開始釋放和GC啓動終止。好極了! –