转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50084543 文章出自:薛瑄的博客
你也可以查看我的其他同类文章,也会让你有一定的收货!
直方图(Histogram)
MAT最有用的工具之一,它可以列出任意一个类的实例数。
工具入口:
- 用户可以直接在“Overview”选项页中点击“Histogram”进入该工具。
功能:
- 计算出该类所有对象的Shallow heap、Retained Heap。
- 支持使用正则表达式来查找某个特定的类
查找内存泄露或者其他内存方面问题,可以看看最有可能出问题的类有多少个实例是个比较好的选择。
另外,当选择了某条显示条目后,可以通过右击弹出菜单。在诊断内存相关问题时,这个菜单是个非常重要的工具。
如果开发者怀疑这里有内存泄露,可以查看该类的对象持有哪些其他对象,
- MAT支持过滤查询结果(比如说被哪些对象持有)。
- 查询结果出来时,可以选择另外一个有用的工具-”Path toGC Roots”它支持多种过滤选项,比如 排除弱引用 (具体操作参考这里),因为当GC运行时,被弱引用持有的对象会被GC直接回收,所以这种对象是不会造成内存泄露的,一般直接把这种信息排除。
如果MAT预定义的查询不能满足用户需求的话,它还支持自己定制查询,定制的自由度非常大,拥有无限的可能。本文稍后会介绍如何高效的定制查询。
支配树(Dominator Tree)
支配树可以算是MAT中第二有用的工具,它可以将所有对象按照保留堆大小排序显示。
工具入口:
- 用户可以直接在“Overview”选项页中点击“Dominator Tree”进入该工具。(显示dump文件中所有的对象)
- 在上面提到的菜单中选择“immediate dominators”进入该工具。(从类的层面上查找并聚合所有支配关系。)
支配树有以下重要属性:
- 属于X的子树的对象表示X的保留对象集合。
- 如果X是Y的持有者,那么X的持有者也是Y的持有者。
在支配树中表示持有关系的边并不是和代码中对象之间的关系直接对应,比如代码中X持有Y,Y持有Z,在支配树中,X的子树中会有Z。
这三个属性对于理解支配树而言非常重要,一个熟练的开发人员可以通过这个工具快速的找出持有对象中哪些是不需要的以及每个对象的保留堆。
查询(Queries)
查询是用来检查对象树的基本工具
工具入口:
在Histogram或Dominator Tree列表中的class name 每一项右键的弹出
内存分析就是在许多对象中查找不希望看到的引用关系的过程,如果可以过滤这些对象和应用关系的话可以使这项复杂的运动简单不少。
一个开发人员想要成功的调试内存问题,必须掌握两个关键点。
- 对应用充分了解
- 掌握过滤和查找的技巧。
如果开发者知道对象结构,而且也可以快速的找到想要的东西,那么找到那些异常状况将会变得容易一些。这里列出MAT工具所有内建的查询:
(【译者注】下面表格中的前两列都是MAT工具中菜单的名称)
查询: | 选项: | 描述: |
---|---|---|
List objects | With Outgoing References | 显示选中对象持有哪些对象. |
With Incoming References | 显示选中对象被哪些对象持有。[ 如果一个类有很多不需要的实例,那么可以找到哪些对象持有该对象,让这个对象没法被回收 ] | |
Show object by class | With Outgoing References | 显示选中对象持有哪些对象, 这些对象按类合并在一起排序 |
With Incoming References | 显示选中对象被哪些对象持有.这些对象按类合并在一起排序 | |
Path to GC Roots | With all references | 显示选中对象到GC根节点的引用路径,包括所有类型引用. |
Exclude weak references | 显示选中对象到GC根节点的引用路径,排除了弱引用. [弱引用不会影响GC回收对象] | |
Exclude soft references | 显示选中对象到GC根节点的引用路径,排除软引用(【译者注】软引用持有的对象在内存空间足够时,GC不回收,内存空间足够时,GC回收) | |
Exclude phantom references | 显示选中对象到GC根节点的引用路径,排除虚引用(【译者注】虚引用是最弱的引用,get()总是返回null,当它的对象被GC回收时,GC将reference放在ReferenceQueue中,用户代码当发现这个reference在在ReferenceQueue时就知道它持有的对象已经被回收了,这时可以做一些清理工作。《Java编程思想》第四版,中文版,第87页写到Java的finilize方法是为了对象被回收前做清理工作,但是事实上会有隐患,虚引用正是弥补) | |
Merge Shortest Paths to GC Roots. | 从GC Roots节点到该对象的最短引用路径 | |
Java Basics | References Statistics Class Loader Explorer | 显示引用和对象的统计信息,列出类加载器,包括定义的类 |
Customized Retained Set | 计算选中对象的保留堆,排除指定的引用 | |
Open in Dominator Tree | 对选中对象生成支配树 | |
Show as Histogram | 展示任意对象的直方图 | |
Thread Details | 显示线程的详细信息和属性 | |
Thread Overview and Stacks | - | |
Java Collections | Array Fill Ratio | 输出数组中,非基本类型、非null对象个数占数组总长度的比例。 |
Arrays Grouped by Size | 显示数组的直方图,按大小分组 | |
Collection Fill Ratio | 输出给定集合中,非基本类型、非null对象个数占集合容量的比例。 | |
Collections Grouped by Size | 显示集合的直方图,按大小分组 | |
Extract Hash Set Values | 列出指定hash集合中的元素 | |
Extract List Values | 列出指定LinkedList,ArrayList或Vector中的元素 | |
Hash Entries | 展开显示指定HashMap或Hashtable中的键值对 | |
Map Collision Ratio | 输出指定的映射集合的碰撞率 | |
Primitive Arrays With a Constant Value | 列出基本数据类型的数组,这些数组是由一个常数填充的。 | |
Leak Identification | Component Report Top Consumers | 分析可能的内存浪费或者低效使用的组件,并输出最大的那个 |
转载:http://www.importnew.com/2433.html
https://yq.aliyun.com/articles/3201?spm=5176.100238.yqhn2.23.tN0gx9
关注我的公众号,轻松了解和学习更多技术