排查线上JVM CPU飙升使用率高和线程死锁问题

一、排查CPU飙升使用率高问题

在开始前新建一个 SpringBoot 项目构建CPU使用率高的场景:

@RestController
public class JvmThread1Controller {ThreadPoolExecutor executor = new ThreadPoolExecutor(10,15,2,TimeUnit.SECONDS,new LinkedBlockingDeque<>(50),new ThreadPoolExecutor.CallerRunsPolicy());@GetMapping("/cpuUsageRate")public String cpuUsageRate() {executor.submit(() -> {int i = 0;while (true) {i = i++ * 10 + 5;System.out.println(i);}});return "success";}
}

上面声明了一个线程池,每次使用线程就从这个里面取,在cpuUsageRate接口中,写了一个死循环,每次都对i进行计算,程序运行起来,肯定cpu的使用率特别高。

启动应用,调用cpuUsageRate接口。

通过 top 查看 cpu 使用情况:

在这里插入图片描述

可以看到有个 java 应用的 cpu 使用率已经达到了 100% ,不出意外这就是上面启动的 java服务,下面假设不知道问题在哪,看是否能分析出问题点。

排查过程

使用 jcmd 查看所有java进程:

jcmd

在这里插入图片描述

这个就是上面启动的java服务,上面的 top 中已经看出就是他 cpu 占用非常高,下面使用 top -Hp 查看该进程下的线程资源占用情况:

top -Hp 30038

在这里插入图片描述
可以看到线程ID30077 的使用率非常高,下面可以通过 jstack 查看该线程的详细情况,但 jstack 中的 ID16 机制的,3007710进制的,因此需要通过 printf '%x\n' 转换:

printf '%x\n' 30077 

在这里插入图片描述

有了线程ID后,就可以通过 jstack 查看详情, -A 50表示关键位置后面50行的信息都取出来:

jstack 30038 | grep -A 50 757d

在这里插入图片描述

从提示的位置查找代码,可以非常清晰的找到问题所在:

在这里插入图片描述

二、排查线程死锁问题

上面我们定位到 cpu 使用率大的线程及定位到了具体位置,这里我们继续定位线程死锁问题,在开始前我们先构建一个死锁的环境:

@RestController
public class JvmThread2Controller {ThreadPoolExecutor executor = new ThreadPoolExecutor(10,15,2,TimeUnit.SECONDS,new LinkedBlockingDeque<>(50),new ThreadPoolExecutor.CallerRunsPolicy());@GetMapping("/threadLock")public String threadLock() {Object resourceA = new Object();Object resourceB = new Object();executor.submit(() -> {synchronized (resourceA) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (resourceB) {}}});executor.submit(() -> {synchronized (resourceB) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (resourceA) {}}});return "success";}
}

上面在第一个线程中首先锁住了 resourceA,第二个线程首先锁住了resourceB,然后等待 1s 的时候,第一个线程再去获取 resourceB 的锁,第二个线程再去获取resourceA 的锁,这显然已经出现死锁了。

下面调用 threadLock 接口,触发死锁场景。下面假设不知道问题在哪,看是否能分析出问题点。

排查过程

使用 jcmd 查看所有java进程:

jcmd

在这里插入图片描述

进程为 5299 ,下面直接通过 jstack -l 寻找死锁的线程:

jstack -l 5299

在这里插入图片描述
从提示的位置查找代码,可以非常清晰的找到问题所在:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526998.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧城市的未来:利用数字孪生技术推动智慧城市的智能化升级

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、城市规划与建设 2、城市管理与运营 3、公共服务与民生改善 4、应急管理与灾害防控 四、数字孪生技术推动智慧城市的智能化升级的价值 1、提高城市管理的智能化水平 2、优化城市资源配置 …

2024年阿里云服务器个人一个月多少价格?5元/月

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

网络协议常见问题

网络协议常见问题 OSI&#xff08;Open Systems Interconnection&#xff09;模型OSI 封装 TCP/IP协议栈IP数据报的报头TCP头格式UDP头格式TCP (3-way shake)三次握手建立连接&#xff1a;为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。每次建立TCP连接…

NeRF模型NeRF模型

参考视频&#xff1a;https://www.youtube.com/watch?vHfJpQCBTqZs&ab_channelVision%26GraphicsSeminaratMIT NeRF模型的输入输出: 输入: (x, y, z): 一个三维空间坐标,代表场景中的一个位置点(θ, φ): 视线方向,θ表示与y轴的夹角,φ表示与x轴的夹角,用两个角度可以…

win11家庭版docker和milvus

docker 1、官网下载docker文件Get Started | Docker&#xff0c;选择download for windows下载。 2、双击打开下载好的文件Docker Desktop Installer.exe&#xff0c;add shortcut to desktop选择√代表同意添加快捷键到桌面&#xff0c;如果不勾选就说明不创建快捷键&#x…

理解JavaScript中的WeakSet和WeakMap

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

活动图高阶讲解-01

14 00:00:36,200 --> 00:00:42,960 下面我们就来进入学习 15 00:00:42,960 --> 00:00:49,640 首先我们先花点时间 16 00:00:49,640 --> 00:00:54,560 从面上把活动图的历史等等 17 00:00:54,560 --> 00:00:56,640 概述的一些内容过一下 18 00:00:57,840 -->…

掌握重排和重绘,让你的网页飞得更高!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载

【Pytorch】新手入门&#xff1a;基于sklearn实现鸢尾花数据集的加载 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

《探索自动驾驶技术的前景与挑战》

自动驾驶技术,作为现代科技的一大突破,正逐渐改变着我们的交通方式、生活方式以及整个社会结构。本文将围绕自动驾驶技术的现状、优势、局限性以及未来发展趋势展开探讨。 自动驾驶技术的现状概述 自动驾驶技术作为当今科技领域的一项前沿技术,已经取得了巨大的进展并在不同…

So you think you understand IP fragmentation?

文章目录 前言一、Why care?二、Prevention三、Well-understood?四、Introducing fragquiz五、A novel (?) algorithm六、Reader challenge七、traceroute八、ICMP参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/960913/ February 7, 2024This article was …