当前位置: 首页 > news >正文

Arthas实战教程:定位Java应用CPU过高与线程死锁

引言

在Java应用开发中,我们可能会遇到CPU占用过高和线程死锁的问题。本文将介绍如何使用Arthas工具快速定位这些问题。

准备工作

首先,我们创建一个简单的Java应用,模拟CPU过高和线程死锁的情况。在这个示例中,我们将编写一个名为CpuController的类,包含两个方法:loop()和deadlock()。

package your.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.TimeUnit;@RestController
@Slf4j
public class CpuController {private Object lock1 = new Object();private Object lock2 = new Object();@GetMapping("loop")public String loop() {log.warn("loop start");while (true) {}}@GetMapping("deadlock")public String deadlock() {log.warn("deadlock start");new Thread(()->{synchronized (lock1) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}synchronized (lock2) {log.info("thread1 over");}}}).start();new Thread(()->{synchronized (lock2) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}synchronized (lock1) {log.info("thread2 over");}}}).start();return "ok";}}

Arthas排查CPU过高过程

步骤一:通过thread命令查看线程情况

thread

在这里插入图片描述

在这里插入图片描述
可以看到ID为17的线程CPU占用过高。

步骤二:通过thread 线程id命令查看线程状态

thread 17

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出CpuController的20行代码,结合代码看出这里是一个死循环

Arthas排查线程死锁过程

步骤一:通过thread -b命令查看线程死锁情况

thread -b

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出死锁已经产生了,结合代码可以看出死锁来源于CpuController的32行

步骤二:通过thread 线程id命令查看线程状态

thread <Thread-7的ID>
thread <Thread-8的ID>

在这里插入图片描述
在这里插入图片描述
可以看出 Thread-7 和 Thread-8 都在等待对方的资源,造成死锁。

总结

通过以上步骤,我们使用Arthas成功定位了Java应用中的CPU过高和线程死锁问题。在实际项目中,遇到类似问题时,可以根据本文的排查步骤进行定位和解决。

http://www.lryc.cn/news/339044.html

相关文章:

  • HTML制作跳动的心形网页
  • 如何在Odoo 17 销售应用中使用产品目录添加产品
  • 为什么pdf拆分出几页之后大小几乎没有变化
  • 如何在 VM 虚拟机中安装 OpenEuler 操作系统保姆级教程(附链接)
  • (六)PostgreSQL的组织结构(3)-默认角色和schema
  • DockerFile定制镜像
  • Java8中JUC包同步工具类深度解析(Semaphore,CountDownLatch,CyclicBarrier,Phaser)
  • 岛屿个数(dfs)
  • 【C++造神计划】运算符
  • Cortex-M3/M4处理器的bit-band(位带)技术
  • 【TOP】IEEE旗下1区,影响因子将破8,3个月录用,CCF推荐,性价比高!
  • 赚钱游戏 2.0.1 版 (资源免费)
  • 服务调用-微服务小白入门(4)
  • 代码随想录算法训练营第三十六天| 435. 无重叠区间、 763.划分字母区间、56. 合并区间
  • 【AIGC调研系列】rerank3是什么
  • Linux下网络编程基础知识--协议
  • 在 VS Code 中使用 GitHub Copilot
  • 使用spring-ai快速对接ChatGpt
  • 免费的 ChatGPT 网站(六个)
  • arm内核驱动-中断
  • 第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组
  • kotlin编译版本
  • 【C#】 删除首/尾部字符
  • 第十五篇【传奇开心果系列】Python自动化办公库技术点案例示例:深度解读Python 自动化处理图像在各行各业的应用场景
  • 什么是MOV视频格式?如何把MP4视频转MOV视频格式?
  • 整理的微信小程序日历(单选/多选/筛选)
  • Unity 人形骨骼动画模型嘴巴张开
  • Python爬虫-京东商品评论数据
  • 实况窗助力美团打造鸿蒙原生外卖新体验,用户可实时掌握外卖进展
  • Go语言mac环境搭建详解