由于经常会关注下线上服务运行情况,有一次无意间看见服务内存占用很高,开始怀疑是不是有内存泄漏的问题,所以接下来几天都关注了下。确实发生了内存泄漏,因为内存一直居高不下,由于线上 jvm 堆内存配置的很高所以一直没有出现内存溢出的问题。
解决这个问题的第一步当然是先拿堆转储文件了。
1
jmap -dump:live,format=b,file=path pid
通过以上命令拿到了堆转储文件文件后就开始分析。
分析使用的工具是 mat。
mat