上上周生产出现问题,记录一下定位问题的方案,原创不易,欢迎关注测试代码:
@RestController@RequestMApping("/test")public class TestController {private static Logger log = LoggerFactory.getLogger(TestController.class);@GetMapping("/test")public boolean test(){Thread t1 = new Thread(new ThreadOne());t1.setName("one");Thread t2 = new Thread(new ThreadTwo());t2.setName("two");t1.start();t2.start();return true;}publicclass ThreadOne implements Runnable {public void run() {int a = 0;while (true) {a++;try {log.info("[ThreadOne]当前a等于:{}",a);Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}publicclass ThreadTwo implements Runnable {public void run() {long a = 0L;while (true) {a++;log.info("[ThreadTwo]当前a等于:{}",a);}}}}触发:
文章插图
第一种方式:1、top找到占用CPU最多的进程

文章插图
2、top -Hp pid 找出8139进程中耗用CPU最多的线程,按H,获取每个线程的内存情况
top -Hp 8139
文章插图
3、printf "%xn" pid 将线程id转成十六进制

文章插图
4、执行jstack命令,得到线程堆栈信息中12509这个线程所在行的后面20行
jstack 8139 |grep 30dd -A 20 >test.txt
文章插图
【线程CPU占用100%的问题怎么定位】
5、将test.txt文件下载到本地,打开就能看到具体的堆栈信息,最后找出可能存在问题的代码

文章插图
这个几个命令确实找到问题,但是整体敲下来需要一点时间,生产环境出现问题,需要争分夺秒,不然损失很大,也可能造成数据积压 。下面推荐一个阿里大神写的一段脚本,只需要三步就可以搞定
第二种:使用show-busy-JAVA-threads快速排查Java的CPU性能问题下载
wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release/show-busy-java-threads
文章插图
添加执行权限
chmod +x show-busy-java-threads启动./show-busy-java-threads或者 sh show-busy-java-threads
文章插图
显然,结果跟第一种一样 。你学会了吗,哈哈
推荐阅读
- AMD|AMD Zen3被逆袭了:Intel 12代酷睿登顶桌面CPU畅销榜
- Linux内存占用常用的几个分析方法,你确定都知道?
- Windows|Win10最佳免费杀软Defender“翻车”了!用户遭殃:内存占用高、黑屏
- AMD|CPU、显卡等芯片还会缺货吗?Intel CEO悲观预测:2024年都好不了
- 内存页面置换
- 电脑cpu太忙怎么办
- linux之lscpu命令
- centos 系统性能检测
- 了解和解释虚拟机上的 CPU Steal Time
- win7系统c盘占用空间大?电脑c盘空间满了,怎么解决
