使用 DebugDiag Tools 分析記憶體問題

這次為了排查專案的記憶體不足,使用 DebugDiag Tools 收集與分析資料。

DebugDiag 可以記錄應用程式當機的位置與原因,也能檢查記憶體用量、分析記憶體洩漏,並監控應用程式效能。

下載與安裝

下載點:Debug Diagnostic Tool v2 Update 3

安裝後主要會用到兩個工具:

DebugDiag 2 Analysis:分析資料。

DebugDiag 2 Collection:收集資料。

DebugDiagnosticsTool2.jpg

分析記憶體用量

這次要找出哪些程式使用了較多記憶體,所以先選擇 Native (non-.Net) Memory and Handle Leak。

NativeMemoryandHandleLeak.jpg

切換到 Processes 頁籤選擇要觀察的程序。範例中的應用程式部署在 IIS,Process Name 是 w3wp.exe;Process Identity 欄位顯示 IIS 設定的名稱。

分析工具查看IIS上的記憶體使用進程.jpg

接著對站臺送出大量請求,觀察記憶體變化。需要擷取資料時,在該 Process 上按右鍵,選擇 Create Full Userdump。

把觀察的進程資料Dump出來.jpg

在 Windows 中,Dump 預設存放在 C:\Program Files\DebugDiag\Logs\Misc。

路徑內會有 .dmp 檔案。用 DebugDiag 2 Analysis 開啟後即可產生報告;報告位置可以自訂,副檔名為 .mht。當時測試似乎只能用舊版 IE 開啟。

把dump出來的檔案右鍵使用分析工具開啟.jpg
佔用的記憶體前幾大項目.png

C# 的 String 是不可變物件;每次修改內容時都會建立新的 String。大量文字處理時,這可能增加記憶體用量。

可以從以下幾個方向調整:

  1. StringBuilder 是可變字串類別,適合反覆修改或組合文字,可減少建立 String 物件的次數。
  2. 連接多個字串時,可用 String.Concat,避免自行建立不必要的中間字串。
  3. 需要組合較複雜的文字時,可使用格式化字串和佔位符。
  4. 若用 + 連接多個字串,每次操作都可能建立新的 String;可以改用 StringBuilder 或 String.Concat。
  5. 不要在迴圈中反覆用 + 串接字串,改用 StringBuilder 可減少物件建立。
  6. 字串比較可明確指定 StringComparison。例如 StringComparison.Ordinal 會比較字串的 ASCII 編碼值,通常比預設比較方式快。

實際調整時,可先檢查迴圈中的字串串接,再評估 StringBuilder、String.Concat 或格式化字串是否適合。字串比較則依需求指定 StringComparison。

參考資料:

如何使用 Debug Diagnostics Tool,在 IIS 中為 CPU 使用率過高的處理序進行疑難排解 - Microsoft 支援服務
說明如何安裝和使用 Debug Diagnostics Tool,在 IIS 中為 CPU 使用率過高的處理序進行疑難排解。
Author image
關於 Richard Zheng
About me 喜歡爬山,瑜伽,溜冰,喜歡新奇的事,最喜歡的還是寫程式帶來的成就感,對於資訊會不斷的出現新事物也能抱持好奇與熱忱。近期開始將學習的心得寫在Blog,發現思路更清晰也加深了記憶。 紙上得來終覺淺,絕知此事要躬行