一:背景
一天线上突然报OOM告警,马上去告警平台去查看JVM监控详情,观察到应用频繁GC,内存一直在高位预警,联想到昨天此应用有新的发布,让运维紧急dump下GC的堆栈信息,立即进行了回滚,回滚后应用运行正常,接下来进行问题的排查;
二:排查
其实对于这类问题排查起来还是比较简单的,主要的思路是第一时间保护案发现场,将GC日志dump下来,利用可视化工具进行分析,这次我使用JDK自带的工具VisualVM进行GC日志分析,分析如下图
通过这个图很容易能看到内存溢出的原因是创建了大量的对象(因为我们的系统访问量一般,排除用户的高并发请求,大概率是查询数据的问题),然后跳到概要里查看异常线程,如下图:
通过这个图,可以直接看到发生异常的地方,然后点击进去查看详细情况,如下图: 然后根据TID去日志平台进行搜索,定位到那个功能的异常,然后具体情况具体分析了;