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一直释放不掉;