排查JAVA进程CPU占用过高

方式1

1.top
alt
看下
us:用户空间占用CPU的百分比
sy:内核空间占用CPU的百分比

2.查看进程内线程运行状态

1
ps -mp 进程ID -o THREAD,tid,time

3.到dump文件核查
转换16进制

1
printf "%x\n" 6766

jstack命令打印线程堆栈信息

1
jstack pid |grep tid

4.已经确定是GC导致,通过jstat查看进程内存状况
jstat -gcutil

alt

5.jstack 和 jmap 分析进程堆栈和内存状况
使用jmap命令导出heapdump文件,然后拿到本地使用jvisualvm.exe分析。(eclipse Mat)

命令: jmap [option] vmid
jmap -dump:format=b,file=dump.bin 6764

命令: jstack [option] vmid
jstack -l 6764 >> jstack.out

方式2

使用以下命令确定受影响的服务器进程的进程ID(PID):
$ jps -v
确定步骤1中标识的PID中的哪个线程正在消耗CPU:
在Unix®和Linux®系统上,可以使用top命令:
$ top -n 1 -H -p [pid]
将[pid]替换为受影响进程的进程ID。

使用以下命令之一为步骤1中标识的PID生成堆栈跟踪:
jstack 命令:
$ jstack -F -l [pid]> [outputfile.txt]
kill -3命令(仅适用于Unix®和Linux®系统),可以始终产生更好的结果:
$ kill -3 [pid]
kill -3命令将堆栈跟踪输出到定向标准输出的日志文件(通常是错误日志文件)。kill -3命令不会停止正在运行的进程。输出堆栈跟踪后,它将继续运行。
将在步骤2中确定为有问题的线程ID转换为十六进制值。在我们的示例输出中,线程ID十进制值8706转换为十六进制值2202。
使用grep在堆栈跟踪输出中搜索此十六进制值。您正在寻找与此十六进制值匹配的线程nid:
$ cat jstack-output.txt | grep -i 2202
此命令提供类似于以下的输出:
“并发标记扫描GC线程” prio = 10 tid = 0x00007f1448029800 nid = 0x2202可运行
在此示例中,我们可以看到问题是垃圾收集器(GC)线程,这表明GC的调整不正确。