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