1. 簡介
JetBrains 全家桶中的 dotTrace 和 dotMemery 可以用來分析.net 程序的CPU使用分布和內存使用分布.dotMemory可以對程序分布進行監控,快照分析,快照對比分析等,功能強大.

圖 1. 內存快照
# 2. 安裝 安裝選擇官方安裝程序: [官網地址](https://www.jetbrains.com/profiler/) ,安裝器中選中dotMemory即可. # 3. 使用 同dotTrace類似,這里也有三種方式分析程序:Attach,Local,Remote.這里使用Local方式啟動被分析程序。

圖 2. 主界面
程序啟動后可以看到內存使用情況:

圖 3. 內存監控界面
點擊右上角的 Get Snapshot 可以生成快照,生成快照期間,程序會卡頓.一般情況下是需要分析內存增長情況,所以需要兩次快照,分析兩次快照之間的內存增長。

圖 4. 生成兩次快照
點擊 Compare 可以對比兩次快照之間的數據差值.

圖 5. 快照對比界面
在快照對比界面,可以根據 Survived objects[存活對象]、New objects [新增對象]、Dead objects [死亡對象]、Objects delta [對象數量差值]、Survived bytes [存活字節數]、New bytes [新增字節數]、Dead bytes [死亡字節數]、Bytes delta [字節數量差值],這幾項進行排序。 這里以新增字節數為例.如圖5所示. 第一種形式:可以看到第一行新增了一個對象,有16兆內存,打開后是具體的數據,我們可以根據名字 Dictionary+Entry
[]在代碼中找到相應的位置,對其進行相應的優化. 第二種形式:如第二行 String 對象,右鍵打開后如圖6所示.選擇 Similar Rentenion 標簽頁,

圖 6. String 的 Similar Rentenion
可以看到每一個分配的String的調用層次以及變量名.找到其在代碼中的位置對其進行優化. 也可以選擇Dominators頁簽和Call Tree頁簽,這兩個頁簽需要在圖2.主界面中選中 Collect momory allocation and traffic data from start 選項,選中后程序運行明顯變慢,但分析數據更加詳細.

圖 7. Dominators 頁簽

圖 8. Call Tree頁簽
4. 總結
C# 不同於C++的地方在於可以使用托管模式將申請的內存使用后交於GC來回收,但是濫用GC,會導致需要回收的內存過大,GC在回收內存時導致卡頓.
通過工具,可以很方便的找到內存的分布和增長點,為后續優化內存打下基礎.優化方法不是這篇文檔的主題,在另一篇文檔中介紹吧.