当我们拿到hprof文件后,该如何分析呢,这时候我们可以用到jdk自带的jhat命令进行分析
jhat -J-Xmx512M *.hprof (这里的-J-Xmx参数可以不要,如果自己机器内存够大的话)
…
…
…
经过漫长的等待后,出现Started HTTP server on port 7000信息时,咱们就可以使用IP+port进行访问了
打开首页后,出现了是一个Arrays,这里太多了,所以我们直接忽略掉,拖到最下面,或者在页面搜索Other Queries
这里我标出来的两部分就是比较重要的两个查询指标,including platform就是会把类似于字节,字符串信息全部进行输出,而exluding platform则不会,exluding只会显示你在项目中定义过的类。
这里我们把including的截图给放出来,
我们可以看到排名第一的是字节对象,他有500多万个实例化对象,所以我们可以进而分析是不是哪个地方出现了泄露,including platform就更方便了,它直接可以指出哪些自定义对象过多,我们也可以排查是不是我们在代码中new了过多的对象。
如果通过这两个选项,我们还无法定位到哪个对象过多,导致泄露所在,那么我们就可以使用show heap histogram选项
点开后是这个样子的,我们可以通过计算total size的大小,这里的单位是字节,换算成G,看到底是哪些对象占用的内存过大,比如我这里,B对象占用了16435273443byte,换算成G,就是15.3G,jvm最大内存我设置为了16G,所以光字节对象就占了15G,那么内存溢出就肯定因为字节对象引起的了。