2010-06-21 82 views
12

當我調試.NET代碼時,如何知道垃圾收集器何時運行?.net垃圾回收器何時運行?

我不想控制垃圾收集器運行的時間。我只希望能夠知道它何時運行。我有一些代碼耗盡資源。我知道這些資源沒有被使用;我想知道GC何時運行以釋放它們。

哦,我心目中的資源是從SQL連接池,而不是內存連接:-)

+1

爲什麼你需要知道它何時運行? – 2010-06-21 21:53:42

+0

垃圾回收器只收集(按定義)垃圾,即不再由程序引用的對象。 – Ken 2010-06-21 21:58:03

+8

問這個問題就像問下一個暴民老闆,當他的下一批藥物預計到達。答案是'沒有你的怪事',緊跟着一個公司:: smack ::頭到後面:) – 2010-06-21 22:10:37

回答

5

你必須使用.NET 4.0,你所要求的是在收費版本中不支持。

基本上,您在循環中調用WaitForFullGCApproach和WaitForFullGCComplete方法。 WaitForFullGCApproach將會阻塞,直到您看到一個GC,WaitForFullGCComplete將會阻塞,直到GC完成。

請仔細閱讀本文。如果你使用這種方法,那麼你有責任確保實際發生的垃圾收集。如果你搞砸了,你可能會破壞GC並快速耗盡內存。

http://msdn.microsoft.com/en-us/library/cc713687.aspx

9

你不應該,在一般情況下,有沒有擔心或思考的GC運行時。

垃圾收集器將根據需要在運行時選擇的不確定時間運行。

如果您希望對GC進行更精細的顆粒控制(除特殊情況外我不推薦),您可以使用GC.AddMemoryPressureGC.RemoveMemoryPressure。這些不會強制GC運行,而是暗示存在其他內存,而不是CLR分配的託管內存。這可能會導致它更頻繁地運行,如果您在本機代碼中分配大塊內存,這會非常有用。

沒有直接跟蹤GC運行的API。 (例如,GC類不包含任何通知垃圾收集發生的事件)。唯一直接瞭解GC執行時的方法是使用profiling API

+0

我發現了一些文檔,它指出.net記錄內存並基於此優化GC運行。這是否意味着如果我需要GC運行以釋放與SQL服務器的連接,我就會感冒了? – 2010-06-21 22:44:46

+0

@新星:不.SQL連接是一個與內存不同的問題。您可以通過conn.Close()手動關閉它:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.close.aspx – 2010-06-21 22:59:22

+0

Hrm ...爲什麼在這裏downvoting? – 2010-06-22 01:11:17

1

在.NET框架中,GarbageCollector運行你。

毫無疑問,.Net被設置爲優化GC。它可能發生在方法調用結束時,或者可能運行一天而不需要GC'd。是否有一個特定的原因需要知道什麼時候收集?

2

每當它感覺就像是

的.NET垃圾收集器是generational garbage collector。這絕對是一種瘋狂的方法,但它不完全是你可以準確預測的東西。

3

沒有垃圾收集釋放池化的數據庫連接。當您關閉/處理連接對象時,連接將返回到池中。連接池本身會管理何時需要打開更多連接並根據連接字符串中連接池的配置和連接池的配置再次關閉它們。除了回收分配給SqlConnection實例的內存之外,垃圾收集與此無關。在詢問垃圾收集和獲取(並接受)與您之後的內容沒有任何關係的答案時(如果我正確理解您的問題),您正在吠叫錯誤的樹。

0

GC運行的兩個重要原因是a)如果第0代滿了b)當堆滿時。禮貌 - CLR Via C#,Jeffrey Richter