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文件
![](https://pics6.baidu.com/feed/d833c895d143ad4b95f1f81ee3afe6a8a60f0641.jpeg?token=f52c0253ff8868aae17352db2c48f796&s=71323D9A85705C2108C199D6020010B1)
![](https://pics6.baidu.com/feed/cf1b9d16fdfaaf51b14584b9eef928e9f11f7a42.jpeg?token=1015933d45f28122a9c821efc4e63e33&s=20186C32150E654D58EDA5DA000050B3)
按对象排序视图进行查看(总览中看到对象总个数:14.1百万个)发现有两个类(ClassClassPath,ClassClassPathList)占用比较大,这两个类约占对象总数的83%(计算方式:5873361*2/14100000=83%)
![](https://pics4.baidu.com/feed/8435e5dde71190efb49c0f79aab62111fcfa6062.jpeg?token=4eccf24e0e98a33eb8088f35a3a8ad2d&s=510AFC1A11DC45C81269F9CA0000C0B1)
分析代码
去代码中全局搜这两个类,发现只有在打日志的时候用到ClassClassPath类
![](https://pics7.baidu.com/feed/29381f30e924b899e07df87d0daba1920b7bf663.jpeg?token=6ebbff16262cd163024b23706ee272b7&s=F910EC131D1E44CC4EF9A4D9020090B3)
分析ClassClassPath相关代码:
用到ClassClassPath对象是一个静态的ClassPool;问题原因:classPath一直被静态的全局pool所持有,导致GC一直释放不掉;