问题发现:
通过linux Top命令查看服务状态发现某个服务占用内存较高,因为服务器资源较少,所以导致服务器卡顿。
问题排查:
1. 通过jmap命令导出该java进程的堆栈信息
jmap -F -dump:format=b,file=devops_dump.bin 298452
2. 通过jstack 命令导出服务线程栈信息备用
jstack 298452 > devops_jstack.log
3. 通过mat 工具分析导出的dump文件
关于mat的使用,我在另一篇文章中也有过说明 记一次JVM内存泄漏问题排查、分析过程_jvm分析工具分析是否内存泄漏步骤-优快云博客
我们如果排查内存泄漏原因,可以直接通过 Leak Suspects来分析,一般通过List objects中两个选项就能追踪到。
with incoming references:直接引用了当前对象的对象,每个对象的 incoming references 可能有 0 到多个。
with outGoing references:对象引用的外部对象(注意不包含对象的基本类型属性。基本属性内容可在 inspector 查看)。
最后发现,是因为项目中有个定时巡检中存在大量的final修饰对象,一些变量也用了final修饰,导致对象一直创建未释放,从而内存会慢慢增高不释放。