java服务CPU过高如何定位

一、查看系统状况

top命令查看CPU、内存等使用情况,这种命令可以动态的获取cpu、内存等信息
top
如果知道具体的业务可以指定对应的进程号
top -p pid
不过一般java服务不仅仅只是一个主线程,还会有很多线程,因此往往需要将线程也给打印出来
top -Hp pid
这里我们会发现COMMAND这一列的字符串显示了线程号(不过是被截断过的),这里我们可以使用-c bw {number} 进行命令的增强显示命令行
top -Hp pid c -bw 500
补充01: 我们可以使用ps命令根据cpu使用率进行排序
ps H -eo user, pid, ppid, tid, time, %cpu,cmd --sort=-%cpu |grep 进程号 
简单的查看线程的信息命令可以使用ps -T -p -pid
补充02:如果是瞬时冲高的线程可以使用top实时地跟踪非常有效,为了查看线程是不是一直存在而且占用cpu, 可以使用命令
ps -mp pid -o THREAD,tid,time
time这一列对应时间也就对应线程占用了多长的时间
补充03:
可以使用Linux命令pstack查看某个进程的当前线程栈运行情况

二、定位问题线程

通过步骤一我们已定位到cu占用率很高的线程
2.1 将线程id转换为16线程
printf "%x" xxx
2.2 jstack 查看线程堆栈信息
jstack 命令打印线程堆栈信息,命令格式:jstack pid | grep -A 20 tid, 其中-A 20代表显示匹配上之后的代码的20行
根据打印处理的代码堆栈的代码行号的,就能找到对应的代码位置了

你可能感兴趣的:(后端开发,java,jvm,性能优化)