当log报错打印java.lang.OutOfMemoryError: GC overhead limit exceeded时,可以用几个命令来分析
1、使用jmap -histo:live pid >a.log
2、10分钟后再执行以上命令
jmap -histo:live pid >b.log
比较两个导出文件中哪个类的占用内存一直在增加,则归为可疑对象
如果命令执行时报 Exception in thread "main" java.lang.InternalError: Remote thread failed for unknown reason,可以使用jmap -F -histo pid 强制导出
3、找到可疑类后,使用jmap -dump:live,format=b,file=a.bin pid 导出堆信息
用MAT导入,查看可疑类和histogram中retained heap最大的类
找到对应的类,使用show object by class 查看被哪些类引用,一般关注用户定义的类,找到问题