对于线上系统突然产生的运行缓慢问题,如果该问题导致线上系统不可用,那么首先需要做的就是,导出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工具进行查看。