排查线上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

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络原理】使用Java基于TCP搭建简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;ServerSocket API&#x1f338;Socket API &#x1f340;TCP中的长短连接&#x1f333;建立TCP回显客户端与服务器&#x1f338;TCP搭建服务器&#x1f338;TCP搭建客户端 ⭕总结 TCP服务器与客户端的搭建需要借助以下API &#x1f384;…

springcloud-alibaba Sentinel入门

Releases alibaba/Sentinel GitHubSentinel下载官方 在cmd 里面运行 启动命令 java -jar sentinel-dashboard-1.8.6.jar 启动成功前提 java环境 &#xff0c;已经注册到服务注册中心&#xff0c;8080端口没有被占用 启动后访问地址为 qhttp://localhost:8080http://lo…

Clion开发STM32之printf的缓冲区验证方式

前言 clion开发stm32时&#xff0c;涉及到printf函数的重写&#xff0c;一般我们重写__io_putchar函数经发现printf函数在没有加换行符时&#xff0c;数据不会立刻通过串口发送数据&#xff0c;而是等到1024字节之后发送数据 测试 主程序 现象 debug调试 不加换行的情况 总…

Windows系统安装Tomcat并结合内网穿透实现公网访问本地网页

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个拥有强大功能的轻量级服务器&#xff0c;由于其可以实…

万界星空科技MES系统中的车间管理的作用

在了解mes生产管理系统的作用包括哪些方面之前&#xff0c;我们先来了解一下作为生产管理信息化的关键部分&#xff0c;车间管理系统包含哪几个部分&#xff1a;一、mes系统中的车间管理通常包含以下部分&#xff1a; 1、设备管理&#xff1a;用于监控车间内的设备状态&#xf…

网络安全: Kali Linux 进行 MSFvenom 程序利用

目录 一、实验 1.环境 2. Kali Linux 进行 MSFvenom 程序利用 3. 创建计划任务自动运行 MSFvenom 程序 二、问题 1.在线加密解密 2.MSF 运行失败 3.MobaXterm 连接Ubuntu 失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux20…

大数乘法算法

例题&#xff1a;6-10 阶乘计算升级版&#xff08;pta--基础编程题目集&#xff09; 此方法的原理就是把数字的每一位拆分出来&#xff0c;存到数组中&#xff0c;在求阶乘时&#xff0c;每一次乘法都分解为数组的每一位乘这个数&#xff0c;例如&#xff1a; 4的阶乘&#x…

Unity--自动版面(Grid Layout Group)

Unity--自动版面&#xff08;Grid Layout Group&#xff09; Grid Layout Group 网格布局组组件将其子布局元素放置在网格中。 Padding&#xff1a;&#xff08;填充&#xff09; 布局组边缘内的填充。与其他布局组不同&#xff0c;“网格布局组”将忽略其所包含布局元素的最…

(黑马出品_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术Docker 今日目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2…

阿里云服务器租用价格表,2024年月付和年付租用优惠价格表

2024阿里云服务器优惠活动政策整理&#xff0c;阿里云99计划ECS云服务器2核2G3M带宽99元一年、2核4G5M优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;云服务器8核…

【Attribute】Inspector视图可视不可编辑字段特性

简介 在Unity开发中&#xff0c;有时候我们存在这种需求&#xff0c;需要在Inspector视图中可以查看字段信息但是无法对字段进行赋值&#xff0c;那么我们也可以像Unity内置的[SerializeField]、[Tooltip]等特性那样自定义一个特性&#xff0c;用于满足这个需求。 代码示例(C#…

umi4 项目使用 keepalive 缓存页面(umi-plugin-keep-alive、react-activation)

umi4使用keepalive 配置文件config\config.ts export default defineConfig({plugins: [umi-plugin-keep-alive], });安装add umi-plugin-keep-alive yarn add umi-plugin-keep-alive页面 A import { KeepAlive, history, useAliveController } from umijs/max; const Page…

【环境配置】Linux MySQL8 忘记密码解决措施

本片博客介绍 Linux 操作系统 Ubuntu 下&#xff0c;MySQL8 忘记密码怎么重新设置&#xff0c;笔者亲测有效&#xff0c;分享给大家。 查看 MySQL 版本 $ mysql --version停止 MySQL 服务器&#xff0c;并查看状态是否变更为 Server shutdown complete # 等价命令sudo syste…

基于SpringBoo的火车订票管理系统(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

部署到 Adreno™ GPU

介绍​ Adreno™ 是由高通开发并用于许多 SoC 的图形处理单元&#xff08;GPU&#xff09;半导体 IP 核系列。 Adreno™ GPU 可以加速复杂几何图形的渲染&#xff0c;在提供高性能图形和丰富的用户体验的同时拥有很低的功耗。 TVM 使用 TVM 的原生 OpenCL 后端 和 OpenCLML …

Canal安装使用

一 Canal介绍 canal是阿里巴巴旗下的一款开源项目&#xff0c;纯Java开发。基于数据库增量日志解析&#xff0c;提供增量数据订阅&消费&#xff0c;目前主要支持了MySQL&#xff08;也支持mariaDB&#xff09;。 背景 早期&#xff0c;阿里巴巴B2B公司因为存在杭州和美国…

人工智能课题、模型源码

人工智能研究生毕业&#xff5e;深度学习、计算机视觉、时间序列预测&#xff08;LSTM、GRU、informer系列&#xff09;、python、人工智能项目代做和指导&#xff0c;各种opencv图像处理、图像分类模型&#xff08;vgg、resnet、mobilenet、efficientnet等&#xff09;、人脸检…

什么是Python网络爬虫

Python网络爬虫是一种自动化获取网页内容的程序。它可以通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;并从中提取所需的数据。下面是一个简单的概述&#xff0c;帮助您理解Python网络爬虫的基本原理。 导入所需的库&#xff1a; 在Python中&#xff0c;我们可以…

大数据工程师的日常工作内容是干嘛?

前言 随着数字化时代的来临&#xff0c;大数据已经成为了许多领域不可或缺的重要资源。而大数据工程师掌握着处理、分析和应用大数据的核心技能。那么&#xff0c;大数据工程师的日常工作内容到底是什么呢&#xff1f; 我曾在智慧交通、用户画像及推荐、运营分析、平台研发等…

【异常 - 错误的更优解决方案】

目录&#xff1a; 前言异常&#xff08;一&#xff09; c语言原有的错误处理方式&#xff08;二&#xff09; 异常的概念&#xff08;三&#xff09;异常的使用1.异常的抛出与捕捉2.函数调用链中异常栈的展开原则 &#xff08;四&#xff09;5组测试及对应结论1.常规测试2.异常…