【JDK】JDK自带工具应用——堆分析

堆分析需要用到两个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/中文看这里

原文地址:https://www.cnblogs.com/tigerhsu/p/10968901.html