FreezeJ' Blog

Java进程异常问题排查

2022-06-28

参考:https://mp.weixin.qq.com/s/7urCG7CnvbnerK9WhTNnZA

对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出jstack和内存信息,然后重启系统,尽快保证系统的可用性。

通过jstack排查

通过top命令查看当前系统最高CPU(P)、内存(M)占用进程,获取其PID,通过以下命令进一步查看线程情况。

导出jstack信息:

jstack <PID> > /tmp/jstack.txt  # 强制导出使用-F

查看进程相关线程信息:

top -Hp <PID>

以上图为例,寻找PID为14003相关线程的信息,先把14003转换为16进制:

THREAD_PID=14003
echo "obase=16;${THREAD_PID}" | bc
# 36B3

查找jstack.txt中nid=0x36B3相关的信息

如果指向VM Thread一行,而VM Thread指的就是垃圾回收的线程。通过如下命令可以查看GC的情况:

# 每1秒输出PID进程的gc信息,输出10次
jstat -gcutil <PID> 1000 10

如果FGC过高,则疑似内存溢出导致的系统缓慢。

通过jmap导出内存镜像

jmap -dump:format=b,file=/data/heap.hprof <PID>

导出文件为/data/heap.hprof可以通过eclipse的mat工具进行查看。