鲲鹏社区首页
EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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,没有出现假死问题,进程假死问题解决。