通过jhat分析内存泄漏

dump堆信息

jcmd

jmap

jconsole

jvisualVM等等工具

虚拟机添加-XX: HeapDumpOnOutOfMemoryError 选项, 在抛出 OutOfMemoryError 时, 会自动执行堆转储。

分析dump文件

jhat -J-Xmx512M dump.hprof

说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。

image-20200103102032963

在浏览器中输入ip端口(端口在上面的日志中已经给出)

image-20200103102129564

这个页面包含了各种功能
下面执行几个

All classes including platform

把堆所有类信息显示出来(默认是不包括Java平台的类)

image-20200103102634853

All Members of the Rootset

从根集能引用到的对象

image-20200103102859428

这个没怎么看懂,看到nanjing这个类只是被加载了下的意思吗?

Instance Counts for All Classes (including platform)

显示平台包括的所有类的实例数量

image-20200103102940662

可以看到NanJing28Suo这个类的实例是最多的
点击这个类进去,能够看到类的一些基本信息

image-20200103103108357

Instance Counts for All Classes (excluding platform)

平台外的所有对象信息

image-20200103103246851

看到只有两个,这里我们还是跟上面Instance Counts for All Classes (including platform)一样能够点击进去看信息

Heap Histogram

堆实例的直方图

image-20200103103452633

点击一下instance count 或者 total size进行排序。

可以看到最多的还是NanJing28Suo这个类的实例最多,这个时候点击它进去

image-20200103103527603

还是刚才熟悉的页面

Show finalizer summary

等待回收

image-20200103104459463

可以看到等待回收的是0,这肯定是有问题的。

Object Query Language (OQL) query

执行对象查询语句

image-20200103103831395

有篇博客还不错:https://www.iteye.com/blog/bijian1013-2221447

英文比较好的话

image-20200103104047174

image-20200103104054920

分析内存泄漏

一般主要看:

Show instance counts for all classes (excluding platform)

Show heap histogram

总结

目前看来jhat可能并不是一个很好的方式,不能定位到代码级别,作为一个颜控表示这个页面做的有点粗糙呢~~~
还是MAT比较好用我个人认为

引用

java命令–jhat命令使用 https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html

JVM学习笔记——jhat的使用 https://www.jianshu.com/p/ddc6d843a8a0

【Java命令二】jhat https://www.iteye.com/blog/bit1129-2187290

jhat中的OQL(对象查询语言)https://www.iteye.com/blog/bijian1013-2221447