Java进程假死
定位思路
服务器请求无响应,Java进程未停止,CPU占用率保持不变,垃圾回收器停止工作。定位思路如图1所示。
- 服务请求无响应,使用top,确认Java进程存在,且相关进程CPU占用率保持稳定。
- 使用jstat,查看young GC次数,若在有业务请求的情况下保持不变,没有增加,确认垃圾回收器停止工作。
- 使用jstack,打印Java进程堆栈信息,确认大部分业务进程处于Block状态,进程处于假死状态。
- 查看线程日志,分析原因。
- 修改代码,重新运行,验证。
- 若问题解决,则合入修改。
- 若问题未解决,增加调试信息,重新定位。
案例:GC机制引起假死
问题现象:
客户业务在x86和鲲鹏上进行混部测试,鲲鹏节点无规律出现假死,不响应主节点心跳查询,被踢出集群。
定位过程:
- 使用top命令,如下图所示,确认Java进程存在,且相关进程CPU占用率保持稳定。
- 使用jstat,查看young GC次数不增加,确认垃圾回收器停止工作。
- 使用jstack,打印Java进程堆栈信息,分析大部分业务进程处于Block状态。
- 使用pastack打印节点断连后presto进程的调用栈信息,发现相关线程一直在运行SpinPause函数(自旋等待),该函数由GC机制调用引起,正常情况GC完正常结束,但节点presto进程一直在运行SpinPause函数,确认为JDK的问题。
- 替换JDK为毕昇JDK,没有出现假死问题,进程假死问题解决。
父主题: 疑难问题