2009-02-17 69 views
9

是否可以看看在調用GC.Collect()時收集的所有.net對象?如何調試.net垃圾收集?

我需要看看什麼對象仍然在內存中,而不是回收,所以我可以找到回收對象應該做的手動,但被程序員遺忘。
我不想調用GC.Collect,因爲某處的某個人忘記了處理阻塞某些句柄的對象。

+0

「應該[收集]」是一個古怪的短語與GC – user7116 2009-02-17 14:42:23

+0

我聽到人們說,所有的時間! Dev說:「它超出範圍,爲什麼不收集?」假設GC將自動執行*所有操作*。雖然這是一部驚人的作品,但並不完美。你對GC的瞭解越多,知道的越多,如果你不小心,就會泄漏記憶。 – 2009-02-17 14:48:11

回答

6

我發現最好的方法是使用windbg和SOS(罷工之子)擴展。它有一個相當神祕的命令行,但它非常強大。它有能力轉儲堆並將其劃分爲GC代碼堆。一旦你通過了最初的學習曲線,就很容易跟蹤哪些對象在堆的哪一部分存在。下面是使用SOS

編輯 OP詢問sos.dll的位置的例子幾個網站。它包含在.Net框架的安裝中。它位於

%WINDIR%\ Microsoft.Net \框架\ V2.0.50727 \ sos.dll

但是,一旦你有WinDbg中加載你不需要完整路徑。只是我們的.loadby方法。

.loadby SOS的Mscorwks.dll

它會尋找在同一個目錄中的版本SOS作爲當前版本mscorwks的(在CLR)

1

我用SciTech's Memory profiler。使用蝙蝠很複雜,但有一些很好的教學視頻。它會讓你看看哪些物體沒有妥善處理,收集的是哪一代物體。無法調試內存泄漏沒有它...