這次為了排查專案的記憶體不足,使用 DebugDiag Tools 收集與分析資料。
DebugDiag 可以記錄應用程式當機的位置與原因,也能檢查記憶體用量、分析記憶體洩漏,並監控應用程式效能。
下載與安裝
下載點:Debug Diagnostic Tool v2 Update 3
安裝後主要會用到兩個工具:
DebugDiag 2 Analysis:分析資料。
DebugDiag 2 Collection:收集資料。

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

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

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

在 Windows 中,Dump 預設存放在 C:\Program Files\DebugDiag\Logs\Misc。
路徑內會有 .dmp 檔案。用 DebugDiag 2 Analysis 開啟後即可產生報告;報告位置可以自訂,副檔名為 .mht。當時測試似乎只能用舊版 IE 開啟。


C# 的 String 是不可變物件;每次修改內容時都會建立新的 String。大量文字處理時,這可能增加記憶體用量。
可以從以下幾個方向調整:
- StringBuilder 是可變字串類別,適合反覆修改或組合文字,可減少建立 String 物件的次數。
- 連接多個字串時,可用 String.Concat,避免自行建立不必要的中間字串。
- 需要組合較複雜的文字時,可使用格式化字串和佔位符。
- 若用 + 連接多個字串,每次操作都可能建立新的 String;可以改用 StringBuilder 或 String.Concat。
- 不要在迴圈中反覆用 + 串接字串,改用 StringBuilder 可減少物件建立。
- 字串比較可明確指定 StringComparison。例如 StringComparison.Ordinal 會比較字串的 ASCII 編碼值,通常比預設比較方式快。
實際調整時,可先檢查迴圈中的字串串接,再評估 StringBuilder、String.Concat 或格式化字串是否適合。字串比較則依需求指定 StringComparison。
參考資料:
如何使用 Debug Diagnostics Tool,在 IIS 中為 CPU 使用率過高的處理序進行疑難排解 - Microsoft 支援服務
說明如何安裝和使用 Debug Diagnostics Tool,在 IIS 中為 CPU 使用率過高的處理序進行疑難排解。


