分析视图简介
Java堆分析中每个视图的主要功能
综合报表
列出堆转储的基础信息,同时概括的列出堆中占比最大的一些类、对象、类加载器等信息。综合报表可以看作是其他视图的一个摘要,将其他视图中最重要的信息摘要出来。我们可以获得堆的基本使用情况, 比如对象数量。此外还提供了按实现内存占用大小排序的 Java 类型饼图, 帮助用户快速定位占用内存最多的类型。
对象报表
以可视化的形式列出堆中哪些对象最多,占比最大,哪些可能有潜在问题
类报表
以可视化的形式列出堆中哪些类型的对象最多,占比最大,哪些可能有潜在问题
支配关系
表示对象的支配关系的图。假如对象A支配B,就表示垃圾回收器必须先释放B对象,然后才能释放A对象。以此关系构造的图就叫做对象支配图,该视图是堆分析中最重要的视图,它展示了堆中占比最大的是何种对象,以及该对象为何仍然存活(可以通过GC根路径查看)。
数量统计
根据聚合类型的不同,列出不同的直方图。比如可以按类聚合,列出堆中所有Foo类型的对象数量,对象大小等。
不可达类型
搜集堆中所有不可达对象,然后按照类型聚合。
系统属性
列出所有系统属性(即-Dprop=value
),包括用户名、JDK版本、JDK提供商、Java Home等信息。
类加载器
列出堆中所有类加载器,以及该类加载所加载的类。
线程信息
线程信息视图给出了应用当前的线程情况, 可以用于查看线程的相关信息: 线程名, 堆占用情况, 调用栈信息, 以及局部变量等。通过该视图用户可以分析线程过多, 死锁, 调用栈过深等问题。
堆外内存
有时候应用会出现物理内存使用越来越多的情况, 而堆外内存的不合理使用可能是导致这个情况的原因之一。该视图列出了应用目前使用的所有 java.nio.DirectByteBuffer 对象以及对应的堆外内存信息, 用于排查由于堆外内存导致的物理内存消耗过多的问题。注意堆外内存并不完全等价于DirectBuffer对象,由于DirectBuffer持有UNSAFE分配的堆外内存,它能在一定程度上反映堆外内存的情况(以及潜在的泄漏等问题)。
垃圾回收根
垃圾回收根是指垃圾回收器回收内存时,从根出发,寻找到存活对象,这里的根就是垃圾回收根,垃圾回收根在多个地方都存在,根据类型可以分为JNI、Thread、System Class等,该视图根据垃圾回收根类型列出该类型下所有垃圾回收根。
字符串
列出堆中所有字符串对象以及字符串值
重复类
不同类加载器(如LoaderFoo,LoaderBar)可能同时加载一个类。该视图列出所有重复加载的类,以及该类被哪些类加载器加载。