1、代码模拟
import java.util.Random;
public class HighCPUDemo {
public static void main(String[] args) {
while (true){
System.out.println(new Random(999999));
}
}
}
2 、top命令找出cpu占用最高的进程
如下图 看到java的进程id为7495
3、ps -ef 或者 jps进一步定位,得知具体的程序
命令:ps -ef|grep java|grep -v grep
的到进程编号7495
4、定位到具体线程或者代码
命令:
ps -mp 进程号 -o THREAD,tid,time
其中
- -m 显示所有的线程
- -p pid进程使用cpu的时间
- -o 该参数后是用户自定义格式
我们输入
ps -mp 7495 -o THREAD,tid,time
我们看到7495用了41.2%,但是线程id为7496确用了41.0%,那么它就是有问题的,如下图:
5、将需要的线程ID转换为16进制格式(英文小写字母)
方式1
刚才第四步得到有问题的线程id就是7496
printf “%x\n” 7496
方式2
找到计算器,点击查看
然后选择程序员
然后输入7496 在点击十六进制自动转换,我们自己转换成小写1d48
6.jstack 定位具体的代码
jstack 进程ID |grep tid(16进制线程ID小写英文) -A20
-A20 表示打印出前20行
我们输入:
jstack 7495 |grep 1d48 -A20
发现第六行代码出错了,然后看我们的程序,果然第6行出错了
转载:https://blog.csdn.net/jerry11112/article/details/114678330
查看评论