前言
记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配的原理分析以及常用的JVM问题排查手段和工具分享
故障描述和排查过程
告警服务报警前置核心服务jvm内存达到80%以上
排查过程
1、从监控系统看下内存的具体占用情况
2、看下我们当前内存报警服务的jvm参数配置
3、确定jvm参数配置是否合理
对内存分析
从内存告警容器上获取对内存的快照
jmap -dump:live,format=b,file=xxxx.hprof pid
导出后,将Dump文件下载回本地
使用JDK自带的JVisualVM打开日志文件
分析当前系统中占用内存较多的类
最后找到原因是服务中使用的消息中间件是rabbitmq,使用confirm机制的时候,开发人员会把当前发送的消息放到 缓存类的ConcurrentHashMap中
private static Map<String, String> map = new ConcurrentHashMap<>();
而在消息确认的时候是要在消息确认的时候在finally中主动删除的
新上线的一个发送者缓存消息后一直未主动进行删除,最后ConcurrentHashMap占用内存越来越大,jvm无法进行回收最后造成内存溢出