最近在项目中自测的时候(压力测试)遇到内存泄漏的情况,想查看具体是哪个模块甚至哪个类引起的问题,经同事推荐使用Jmap+MAT的组合进行了一次尝试,下面记录一下,以便今后深入学习使用。
在程序出现内存溢出情况之前,想要观察内存使用情况的话,可以借助atop命令查看内存的使用情况。
这里可以用一个linux下的命令(jps:虚拟机进程状况工具)查看所有Java相关线程的pid等信息。
然后使用jmap(Java内存映像工具)命令,jmap是一个可以输出内存中所有对象的工具,甚至可以将VM中的heap,以二进制输出成文本。jmap-dump:format=b,file=heap.bin 8120可以将8120进程的内存heap输出到heap.bin文件里。它可以打印出某个Java进程(使用pid)内存中所有“对象”的情况(如:产生哪些对象,及其数量)。
再借助MAT(将heap.bin导入到MAT中)生成内存消耗的详细信息。
MAT安装与介绍
下载地址:http://www.eclipse.org/mat/downloads.php。
通过MAT打开dump出来的内存文件,打开后如下图:

从上图可以看到它的大部分功能。
1. Histogram可以列出内存中的对