生产环境中,一旦出现内存泄漏,长期运行下非常容易引发内存溢出(OutOfMemory,OOM)故障。为此,JDK 提供了一些内存泄漏的分析工具,如 jconsole,jvisualvm 等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。
Heap Dump的生成
Linux 下使用 jmap 命令生成 Heap Dump:
# java -version // 检验java环境
# jps // 显示当前所有 JVM 进程 pid 的命令
# jmap -dump:live,format=b,file=/dump/heap-dump.hprof <pid> // 比较耗时, 耐心等待
MAT的使用
下载安装 MAT https://www.eclipse.org/mat/downloads.php。
当成功启动 MAT 后,通过菜单选项 “File -> Open Heap Dump…” 打开指定的 dump 文件后,将会生成 Overview 选项,如下所示:
顶部功能区说明:
- | 功能说明 |
---|---|
Overview | 显示概要信息,并展示了一些常用功能的入口。 |
OQL | MAT 提供了一个对象查询语言(OQL),类似于 SQL,将类当作表,对象当作记录行,成员变量当作表中的字段。 |
Thread Overview | 此工具可以查看生成Heap Dump文件的时候线程的运行情况,用于线程的分析。 |
Run Expert System Test | 可以查看分析完成的HTML形式的报告,也可以打开已经产生的分析报告文件。 |
Open Query Browser | 提供了在分析过程中用到的工具。 |
Find Object by address | 通过十六进制的地址查找对应的对象。 |
Overview 常用功能入口说明:
- | 功能说明 |
---|---|
Histogram | 直方图,可以查看每个类的实例的数量和大小。 |
Dominator Tree | 支配树,列出 Heap Dump 中处于活跃状态中的最大的几个对象,默认按 retained size 进行排序,因此很容易找到占用内存最多的对象。 |
Top Consumers | 按类、类加载器和包分别进行查询,并以饼图的方式列出最大的几个对象。 |
Duplicate Classes | 列出被加载多次的类,结果按类加载器进行分组,目标是加载同一个类多次被类加载器加载。使用该工具很容易找到部署应用的时候使用了同一个库的多个版本。 |
Leak Suspects | Run Expert System Test报告的一种,该报告分析了 Heap Dump并尝试找出内存泄漏点,最后在生成的报告中对检测到的可疑点做了详细的说明。 |
Top Components | 列出占用总堆内存超过 1% 的对象。 |