1. 简介
JetBrains 全家桶中的 dotTrace 和 dotMemery 可以用来分析.net 程序的CPU使用分布和内存使用分布.dotMemory可以对程序分布进行监控,快照分析,快照对比分析等,功能强大.
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102191553253-1754661677.png)
图 1. 内存快照
# 2. 安装
安装选择官方安装程序: [官网地址](https://www.jetbrains.com/profiler/) ,安装器中选中dotMemory即可.
# 3. 使用
同dotTrace类似,这里也有三种方式分析程序:Attach,Local,Remote.这里使用Local方式启动被分析程序。
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102191823817-1378859624.png)
图 2. 主界面
程序启动后可以看到内存使用情况:
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102191924193-126372155.png)
图 3. 内存监控界面
点击右上角的 Get Snapshot 可以生成快照,生成快照期间,程序会卡顿.一般情况下是需要分析内存增长情况,所以需要两次快照,分析两次快照之间的内存增长。
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102192037319-1756908775.png)
图 4. 生成两次快照
点击 Compare 可以对比两次快照之间的数据差值.
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102192155140-1989745020.png)
图 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 标签页,
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102192312684-497019186.png)
图 6. String 的 Similar Rentenion
可以看到每一个分配的String的调用层次以及变量名.找到其在代码中的位置对其进行优化.
也可以选择Dominators页签和Call Tree页签,这两个页签需要在图2.主界面中选中 Collect momory allocation and traffic data from start 选项,选中后程序运行明显变慢,但分析数据更加详细.
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102192420250-318705391.png)
图 7. Dominators 页签
![](https://img2020.cnblogs.com/blog/319748/202201/319748-20220102192524074-1809791814.png)
图 8. Call Tree页签
4. 总结
C# 不同于C++的地方在于可以使用托管模式将申请的内存使用后交于GC来回收,但是滥用GC,会导致需要回收的内存过大,GC在回收内存时导致卡顿.
通过工具,可以很方便的找到内存的分布和增长点,为后续优化内存打下基础.优化方法不是这篇文档的主题,在另一篇文档中介绍吧.