中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

Java进程假死

定位思路

服务器请求无响应,Java进程未停止,CPU占用率保持不变,垃圾回收器停止工作。定位思路如图1所示。

图1 Java进程假死定位思路
  1. 服务请求无响应,使用top,确认Java进程存在,且相关进程CPU占用率保持稳定。
  2. 使用jstat,查看young GC次数,若在有业务请求的情况下保持不变,没有增加,确认垃圾回收器停止工作。
  3. 使用jstack,打印Java进程堆栈信息,确认大部分业务进程处于Block状态,进程处于假死状态。
  4. 查看线程日志,分析原因。
  5. 修改代码,重新运行,验证。
  6. 若问题解决,则合入修改。
  7. 若问题未解决,增加调试信息,重新定位。

案例:GC机制引起假死

问题现象:

客户业务在x86和鲲鹏上进行混部测试,鲲鹏节点无规律出现假死,不响应主节点心跳查询,被踢出集群。

定位过程:

  1. 使用top命令,如下图所示,确认Java进程存在,且相关进程CPU占用率保持稳定。

  2. 使用jstat,查看young GC次数不增加,确认垃圾回收器停止工作。

  3. 使用jstack,打印Java进程堆栈信息,分析大部分业务进程处于Block状态。

  4. 使用pastack打印节点断连后presto进程的调用栈信息,发现相关线程一直在运行SpinPause函数(自旋等待),该函数由GC机制调用引起,正常情况GC完正常结束,但节点presto进程一直在运行SpinPause函数,确认为JDK的问题。
  5. 替换JDK为毕昇JDK,没有出现假死问题,进程假死问题解决。