如何找到 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。