一、现象描述
一个JVM进程运行一段时间后,应用线程卡住不能继续正常运行。
二、排查复盘
排查过程复盘:
0. 执行jstat
命令,发现进程持续进行“Full GC”,导致应用线程卡住
0. 分别执行jmap
和jstack
命令,dump堆内存快照和线程快照
0. 使用Memory Analyzer解析堆内存快照,发现所有应用线程几乎耗尽所有堆内存,结合线程快照,发现这些应用线程都处于正常工作路径,且都处于“RUNNABLE”的线程状态
0. 根据上一点发现可知,该进程正常运行的确需要更多堆内存(不存在“内存泄漏”,“垃圾回收策略可改进”等可能),加大堆内存,进程正常运行,问题不再重现
图1 Memory Analyzer解析堆内存快照结果(由于截图所限,只是部分应用线程)
图2 线程快照内相应线程信息(以“pool-1-thread-1”应用线程为例)