Dot-Net

如何使用轉儲文件來診斷記憶體洩漏?

  • March 1, 2012

我有一個 .NET 服務,其正常的私有工作集約為 80 MB。在最近的一次負載測試中,程序達到了 3.5 GB 記憶體使用量,導致整機物理記憶體不足(使用了 4 GB 中的 3.9 個),並且在負載測試停止後很長時間沒有釋放記憶體。使用任務管理器,我獲取了程序的轉儲文件並在 Visual Studio 2010 SP1 中打開它,我可以開始對其進行調試。

如何診斷記憶體問題?我可以使用 dotTrace Memory 3.x,它是否支持對轉儲文件進行記憶體分析?如果沒有,Visual Studio 2010 Premium 的記憶體分析功能會有所幫助嗎(我目前有 Professional)?WinDbg 可以提供幫助嗎?

**更新:**新的Visual Studio 2013 Ultimate現在可以使用轉儲文件本地診斷記憶體問題。有關更多詳細資訊,請參閱此部落格文章

安裝 WinDbg。您需要確保根據您的轉儲獲得正確的 x86 或 x64 版本。這是x86下載的直接連結。

在這方面,您需要確保您進行了正確的轉儲。您可以使用任務管理器創建轉儲文件(右鍵點擊程序 -> 創建轉儲文件)。如果您使用的是 64 位並且您的程序是 x86,請使用 32 位版本的任務管理器 (C:\Windows\SysWOW64\taskmgr.exe) 來獲取轉儲文件。有關獲取轉儲文件的更多資訊,請參閱我的文章,例如,如果您使用的是 XP 並且需要使用 windbg 創建轉儲文件。

警告有一個相當陡峭的學習曲線,事情可能不會完全按照這裡描述的那樣工作,所以如果有任何問題,請回來。

我假設您使用的是 .NET4,因為您可以在 Visual Studio 中打開轉儲。以下是幫助您使用 dmp 文件的快速指南*:*

1)執行WinDbg,將符號路徑(文件->符號搜尋路徑)設置為

SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
  1. 打開故障轉儲或將您的 .DMP 文件拖到 WinDbg 上。

3)在命令視窗中輸入

.loadby sos clr

(僅供參考,對於 .NET 2,命令應該是.loadby sos mscorwks

4)然後輸入這個

!dumpheap -stat

其中列出了對象的類型及其計數。看起來像這樣:

在此處輸入圖像描述

您必須在應用程序的上下文中對此進行分析,看看是否有任何異常。

windbg還有很多,Google是你的朋友。

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