线上问题排查

现象

cpu高占用,程序无响应。

处理流程

先排查交易哪些线程高占用CPU

top -Hp pid  (shift+p 按cpu排序,shift+m 按内存排序)

根据当时情况,发现有四个线程CPU占用率一直高占。假设当前占用最高的线程ID是9899

查找线程信息

转换成对应的16进制PID (PID为上一步中获取到的线程号)

printf '%x\n' PID

然后使用jstack 获取对应的线程信息

jstack 进程pid | grep -A 20 '0x7d0',查找nid匹配的线程,查看堆栈,定位引起高cpu的原因

导出jstack 线程内容

jstack -l 进程pid

这时候可以根据打印出来的线程信息,来判断程序发生了什么异常。

dump出jvm内存,分析gc原因

jmap -dump:format=b,file=dumpFileName pid

举例(pid是进程的pid)

jmap -dump:format=b,file=/tmp/20191110.dat 30193

使用mat工具分析dump文件

可以在网上下载一个专业分析jvm内存的工具,如mat来进行分析,找出异常的内存占用对象后,再看代码进行下一步分析。

jstack -l

线上oom快速分析

查看堆的大小,old区和young区的使用情况

jmap -histo:live 进程pid | more

使用jmap,查看当前堆的大对象

jmap -histo:live 进程pid | more