jmap heap 分析

1.

 可以看到最耗CPU的线程都是在进行GC用Jmap命令查看当前堆的使用情况(发现老年代现在已占用99.8%+)

 其中17038为进程号jmap -heap 17038

进行jstat gc 分析:其中17038为进程号,5000是指每5秒(5000毫秒)输出一次

分析问题产生原因

由于线上当时直接重启,未能保留当时的JVM内存文件;在开发环境进行循环压测,复现线上问题,然后导出dump文件进行分析找到原因生成dump文件命令# 其中fileName是导出后dump名称,pid为进程号jmap -dump:format=b,file=fileName.dump pid将dump文件导出到本地,用Eclipse Memary Analysis(MAT官网下载地址) 进行分析MAT导入dump文件

按对象排序视图进行查看(总览中看到对象总个数:14.1百万个)发现有两个类(ClassClassPath,ClassClassPathList)占用比较大,这两个类约占对象总数的83%(计算方式:5873361*2/14100000=83%)

分析代码

去代码中全局搜这两个类,发现只有在打日志的时候用到ClassClassPath类

分析ClassClassPath相关代码:

用到ClassClassPath对象是一个静态的ClassPool;问题原因:classPath一直被静态的全局pool所持有,导致GC一直释放不掉;

 
原文地址:https://www.cnblogs.com/SunshineKimi/p/14608084.html