堆分析需要用到两个JDK自带工具jmap和jhat。
参考文章:https://docs.oracle.com/javase/7/docs/technotes/tools/index.html
https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
https://blog.csdn.net/a718515028/article/details/86703186
命令清单:https://blog.csdn.net/fenglibing/article/details/6411924
1、用jmap做内存堆转储
jmap的全称是Java Memory Map,作用是做Java的内存映射。
命令格式:jmap -dump:live,file={filename} {pid} 。其中,
filename为dump出来的文件名。
pid为java进程号。
jmap -dump:live,file=dump.txt 10357
另外,如果JMV启动时带了参数 -XX:+HeapDumpOnOutOfMemoryError的话。当发生OOM的时候,会自动生成dump文件(文件路径可由参数-XX:HeapDumpPath设置)。
2、用jhat做dump文件分析
命令格式:jhat -J{flag} {filename} 。其中,
flag为JVM启动参数。实际上jmap和jhat都是基于Java的工具,所以它们在执行的时候都会启动一个JVM。当dump文件很大,在启动时会报堆空间不足的错误,可加参数-J-Xmx512m。
filename为dump出来的文件名。
jhat -J-Xmx512M dump.txt
3、查看分析结果。
jhat命令执行完毕会启动一个web服务器(默认端口为7000),以供结果查阅,地址为http://ip:7000 。
4、其他说明。
分析结果的HTML页面很详细,拉到页面底部,有几条链接比较有用。
①All classes excluding platform
显示所有非Java平台的类(业务类)
②Show all members of the rootset
显示所有根集合,这里的root指的是对引用链(Reference Chain)做可达性分析时的根GC Root 。
③Show instance counts for all classes (including platform)
显示所有类的实例数。
④Show instance counts for all classes (excluding platform)
显示非Java平台类的实例数,包括业务类和第三方类。
⑤Show heap histogram
类实例数及其占用空间统计。
⑥Show finalizer summary
略。
⑦Execute Object Query Language (OQL) query
自定义查询,高级功能。这个比较牛逼,帮助文档:http://ip:7000/oqlhelp/和中文看这里。