Dot-Net

分析程序中載入的本機 DLL 和程序集的記憶體佔用的工具?

  • December 18, 2020

根據任務管理器,我有一個擁有 130MB 記憶體的程序,根據dotTrace ,只有 11MB 的實時 .NET 對象,所以我想知道其他 120MB 發生了什麼?

我需要一個工具來列出程序中載入的程序集和本機 DLL,獲取程序中圖像的大小,並且對於每個程序集,測量 JITed 方法的記憶體佔用。

來自SysInternal的 ListDlls部分完成了這項工作。但它不測量 JITed 程式碼大小,它只提供原始數據。理想情況下,我想要一個 UI 來分析和總結這些數據。

最近,Visual Studio 團隊報告說使用PerfView工具進行了此類分析。這在博文Visual Studio 11 Beta Performance Part #1部分:The Biggest VM Consumer - DLLs中有說明。有人有使用 PerfView 分析本機 Dll 和程序集足蹟的經驗和回饋嗎?

除了ListDllsPerfView,你會推薦任何其他工具嗎?


好的,Simon Mourier建議的VMMAP似乎是更適合這項任務的工具。VMMAP 顯示大部分工作集記憶體進入託管堆棧(下圖中綠色為 113MB),因此問題更多與 .NET 對象相關,而不是非託管記憶體。綠色鋸齒曲線只是裝載/解除安裝會話的時間線。由於某些原因,我的第一個措施是完全錯誤的:在此處輸入圖像描述

  • dotTrace 告訴我分配了 41MB 的 .NET 對象,
  • WMMAP 顯示一個 180MB 的工作集(任務管理器顯示類似的數字)
  • WMMAP 顯示由 GC 分配的 113MB 託管堆。此託管堆記憶體中有 90MB 在工作集中:

所以我的計劃是:

  1. 確定 GC 為何為 41MB 的 .NET 對象分配 113MB 的託管堆?(這樣的數字正常嗎?是因為高度碎片化嗎?)
  2. 努力縮小分配的這組 41MB 的 .NET 對象!

既然你提到了 sysinternals 的 ListDlls,還有另一個工具叫做Process Explorer,它有大量的資訊,而且比 ListDlls 好得多(你要確保你有最新的版本,也有很多 .NET 資訊,支持 64 -bit 和 32 位程序等)。

對於每個程序,您可以同時查看以列或每個程序顯示的非託管記憶體(私有字節等)和託管記憶體(GC 集合、大型對象堆等)。

sysinternals 的另一個很酷的工具是VMMAP。它是一個程序記憶體分析實用程序,顯示了不同類型的虛擬和物理記憶體類型的細分。

至於你 120Mb 的問題,你真的想檢查注入到你的程序中的所有非託管 DLL,它們不是標準 Windows 安裝或標準 DLL 程序集的一部分。對於如此大的分配,我當然會首先跟踪圖形組件,因為它們以分配大塊記憶體而聞名(尤其是當您談到諸如 NDepend 之類圖形工具時)。Process Explorer 還可以跟踪 GDI 和 USER 對象的數量。

關於 GDI 主題,這裡有一個名為GDIView的免費工具,它提供了每個程序分配的 GDI 對象的詳細資訊。

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