1.登录机器
2.dump堆
# 查看进程ID
ps aux | grep java
# dump存活对象(format=b或者json,存储为二进制或者Json文件)
jmap -dump:live,format=b,file=livedump.hprof <pid>
# 所有对象dump
jmap -dump:format=b,file=alldump.hprof <pid>
3.下载dump文件
在下载之前,先压缩文件
# 压缩命令
tar zcvf <压缩后的文件名>.tar <被压缩的文件>
# 示例
tar zcvf gclog.tar a_gc_file.log
4.使用MAT工具来分析
安装最近版本的MAT需要jdk11以及以上的版本。使用Eclipse MAT来分析,查看哪个对象最大以及引用从哪里来(point in)
光标放在最大的对象上,就可以看到这个对象是哪个对象了。
Shallow size:该对象本身的大小,不包括被这个对象引用的其他对象。
Retained size:该对象本身的大小,以及被这个对象引用的其他对象。
查看最大的对象是被哪个对象引用的,就可以知道是哪里的代码导致了内存泄露。
5.问题处理
- 修改代码,解决GC问题
- 调整GC参数,进行GC优化