如何找到 java 程序 CPU 使用率100%的原因

转载:https://user.qzone.qq.com/285483820/1

最近程序在一台机器上出现了 cpu 占用率100%的情况,而执行同一份代码的其他机器则没有问题。很让我崩溃~~
今天找到了解决方案:
     先用 top 命令,找到 java 进程的 pid:
     如 pid 为 1000;
   再用 top -H -p  1000 命令查看在这个进程中,消耗 cpu 最多 的线程,如 1003;
   最后使用 jstack 1000 > dump_file 把这个进程的堆栈信息 dump 到文件中,
   打开 dump_file,找到 id 为1003的线程(要转化为16进制),就能发现是哪个方法占用了 cpu,分析自己的代码,
 改正 bug!

top命令

显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等

-p 表示进程PID
-c 显示进程的绝对路径
-H 显示进程的所有线程

top -Hp pid 显示所有的线程

可以显示所有的线程

(top显示参数

VIRT 表示 Virtual Memory 虚拟内存
RES 表示 Resident Memory 驻留内存
SHR 表示 shared memory 共享内存

RES 表示 进程占用的 物理内存数,实际使用数,而非申请的内存数)

jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。