使用dotMemory分析C#程序性能瓶颈

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在回收内存时导致卡顿.
通过工具,可以很方便的找到内存的分布和增长点,为后续优化内存打下基础.优化方法不是这篇文档的主题,在另一篇文档中介绍吧.

posted @ 2022-01-02 19:27  liyakai  阅读(2089)  评论(0编辑  收藏  举报