如何使用轉儲文件來診斷記憶體洩漏?
我有一個 .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
- 打開故障轉儲或將您的 .DMP 文件拖到 WinDbg 上。
3)在命令視窗中輸入
.loadby sos clr(僅供參考,對於 .NET 2,命令應該是
.loadby sos mscorwks)4)然後輸入這個
!dumpheap -stat其中列出了對象的類型及其計數。看起來像這樣:
您必須在應用程序的上下文中對此進行分析,看看是否有任何異常。
windbg還有很多,Google是你的朋友。
