教你怎么用jstack定位CPU占用率高的代码
在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序
- 编写死循环demo,提高CPU占用比例
写一个简单的死循环demo,使得CPU占用率飙升
/**
* @author erbon
* @date 2018/8/16 上午11:25
*/
public class Demo {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
System.out.println("hello world");
}
}
}).start();
System.out.println();
}
}
javac Demo.java
java Demo 1>log.out
会看到控制台不停的在打印”hello world
”
- TOP命令定位占用CPU高的进程
执行
top
- TOP -H -p pid定位CPU占用率最高的线程pid
执行top -H -p pid
,查看该进程下占用CPU高的线程id,比如我们定位到我们的占用CPU比较高的进程id为99770
top -H -p 99770
我们会看pid为99803的线程占用CPU最高,将其转换为16进制数,为185db
- 使用jstack定位线程
执行
jstack 99770 > dump.out
将dump输出到dump.out日志文件中
vi dump.out
查看dump日志,查找关键字185db,刚才我们定位的线程pid的16进制表示
这儿不将dump输出到文件,直接执行
jstack 99770 | grep -A 20 185db
也可,其中-A 20
代表显示筛选的行及其后20行
接下来,我们就可以拿到具体业务代码进行分析占用CPU高的原因了。