MAT内存分析工具 mat内存分析工具下载( 三 )


·系统类:被bootstrap/systemClassLoader加载的类,例如在rt.jar包中的所有类 。
·JNI局部变量:本地代码中的局部变量,例如用户自定义的JNI代码或者JVM内部代码 。
·JNI全局变量:本地代码中的全局变量 。
·线程:开始,并且没有停止的线程 。
·在用同步锁:作为锁的对象 。例如调用了wait()或者notify()方法的对象,或者调用了synchronized(Object)操作的对象 。
·Java局部变量:如函数的输入参数及方法中的局部变量 。
·本地栈:本地代码中的输入、输出参数,例如用户自定义的JNI代码或者JVM内部代码 。
·Finalizer:在等待队列中将要被执行析构函数的对象 。
·Unfinalized:拥有析构函数,但是没有被析构且不在析构队列中的对象 。
·不可达对象:从任何一个根对象都无法到达的对象 。但为了能够在MAT中分析,被MAT标志为根 。
·未知对象:未知的根类型,用于处理一些特殊的堆格式 。
通过MAT,可以列出所有的根对象,如图6.82所示 。
【MAT内存分析工具 mat内存分析工具下载】

MAT内存分析工具 mat内存分析工具下载

文章插图
五,内存泄漏检测MAT提供了自动检测内存泄漏,以及统计堆快照内对象分布情况的工具 。图6.83展示了内存泄漏检测工具的使用方法 。选择菜单中的LeakSuspects命令,MAT会自动生成一份报告 。这份报告罗列了系统内可能存在内存泄漏的问题点 。图6.84展示了报告中给出的一个问题点样例 。


MAT内存分析工具 mat内存分析工具下载

文章插图
注意:仔细阅读MAT给出的内存泄漏报告,可以帮助开发人员更快地找到系统的潜在问题 。


MAT内存分析工具 mat内存分析工具下载

文章插图
六,最大对象报告系统中占用内存最大的几个对象,往往是解决系统性能问题的关键所在 。如果应用程序发生内存泄漏,那么泄漏的对象通常会在堆快照中占据很大的比重 。因此,查看和分析堆快照中最大的对象具有较高的价值 。
在MAT中,可以自动查找并显示消耗内存最多的几个对象 。如图6.85所示,通过选择TopConsumers命令,可以打开消耗内存最多的对象的报告,其中主要以饼图和表格的形式来展示 。


MAT内存分析工具 mat内存分析工具下载

文章插图
七,查找支配者通过MAT,开发人员还可以很方便地查找某一个对象或者类的支配者(有关支配者的概念,可以参考6.7.3节“支配树”) 。虽然在支配树页面中拥有完整的信息,但是通过MAT提供的支配者查找功能可以更方便地进行查找 。图6.86显示了如何查找对象的支配者 。


MAT内存分析工具 mat内存分析工具下载

文章插图
在选择ImmediateDominators命令后,会弹出一个参数对话框,用于设置查找参数,如图6.87所示 。在参数对话框中,注意务必正确输入-skip参数,否则查询结果会忽略所有定义在-skip参数中的类和实例 。
ImmediateDominators会输出选中对象的直接支配者(将-skip指定的对象排除在外) 。


MAT内存分析工具 mat内存分析工具下载

文章插图
八,线程分析在堆快照中,还包括当前的线程信息,通过MAT可以查看这些信息 。如图6.88所示,通过ThreadDetails、ThreadOverview和ThreadStacks这3个命令,可以查看线程详情 。


MAT内存分析工具 mat内存分析工具下载

文章插图
图6.89所示为选择ThreadStacks命令后的输出结果,其中显示了当前堆快照中的所有线程及线程引用的对象 。


MAT内存分析工具 mat内存分析工具下载

文章插图
九,集合使用情况分析MAT提供了一套对集合使用状态进行分析的工具,如图6.90所示 。
MAT内存分析工具 mat内存分析工具下载

文章插图
使用这些工具,可以查看数组、集合的填充率;可以观察集合内的数据;也可以分析哈希表的冲突率 。
注意:通过对集合使用情况进行分析,可以更好地了解系统的内存使用情况,查找浪费的内存空间 。
选择CollectionFillRatio命令,可以展示给定集合的填充率 。图6.91所示为该功能的输出结果,其中显示了填充率为0、20%以下、80%以下和100%以下的集合个数 。