Dot-Net

如何調試.net 垃圾收集?

  • February 17, 2009

是否可以查看呼叫 GC.Collect() 時收集的所有 .net 對象?

我需要查看哪些對象仍在記憶體中且未回收,因此我可以找到應該手動回收對象但被程序員遺忘的位置。

我不想呼叫 GC.Collect,因為某個地方的某個人忘記了處理一個阻塞某些句柄的對象。

我發現最好的方法是使用 windbg 和 SOS(罷工之子)擴展。它有一個相當神秘的命令行,但它非常強大。它具有轉儲堆並將其除以 GC 分代堆的能力。一旦你通過了最初的學習曲線,就很容易在堆的哪個部分跟踪哪些對像是活動的。以下是一些使用 SOS 範例的網站

EDIT OP 詢問了 sos.dll 的位置。它包含在 .Net Framework 的安裝中。它位於

%WINDIR%\Microsoft.Net\Framework\V2.0.50727\sos.dll

但是一旦你載入了windbg,你就不需要完整的路徑了。只有我們 .loadby 方法。

.loadby sos mscorwks.dll

它將在與目前版本的 mscorwks(CLR)相同的目錄中查找 sos 的版本

引用自:https://stackoverflow.com/questions/557088