1、通过top或者jps命令查到是那个java进程, top可以看全局那个进程耗cpu,而jps则默认是java最耗cpu的,比如找到进程是196
1.1 top (推荐)或者jps命令均可
2、根据第一步获取的进程号,查询进程里那个线程最占用cpu,发现590消耗最多
top -p 196 -H
3、把堆栈信息dump到本地存储
jstack 196 > ~/jstack.log
4、查询jstack.log相关的 ,pid为 715 的值,可以查看堆栈信息,找到具体的业务代码
5、发现196进程里的线程id:715是最耗cpu的,可以使用linux命令直接kill掉,杀死线程命令是 两个 --
kill --715
======================下面代码可以考虑不看==================================
6、需要注意的是,在jsatck命令展示的结果中,线程id都转换成了十六进制形式。可以用如下命令查看转换结果,也可以找一个科学计算器进行转换。主要查看NID的值(jdk8是16进制,jdk21是10进制)
把590的转换成十六进制 :
printf "%x" 590
或者
转换线程号printf %x 38,查询堆栈jstack 16| grep nid=0x26 -A 10
7、 24e 代表线程的信息,可以24e的值,把jstack 196 > jstack.log 导出的文件,查找相应的线程信息。 目前发现590也能搜到数据,而24e搜不到数据。 所以 4,5可能是错误的。参考文档
https://www.bilibili.com/video/BV15T4y1y7eH/?spm_id_from=333.337.search-card.all.click&vd_source=7d7f4a21d00a9323f6fdc67c7ae8e0f2
面试官:生产环境碰到系统CPU飙高和频繁GC,你要怎么排查? 白天不懂夜的黑_生产环境如何查看gc-CSDN博客