java 服务cpu 100%解决

news/2025/1/8 11:21:01/文章来源:https://www.cnblogs.com/xiaohanlin/p/18659356

online环境发现有个task的微服务白天使用高峰期一直cpu非常高98%-99%

用  如下命令在cpu非常高的时候生成了多个dump文件

jstack <PID> > thread_dump1.txt

jstack <PID> > thread_dump2.txt

jstack <PID> > thread_dump3.txt

jstack <PID> > thread_dump4.txt

jstack <PID> > thread_dump5.txt

jstack <PID> > thread_dump6.txt

 

 

在thread_dump文件中发现很多如下的BLOCKED 的地方大概有100多个

"Thread-509207" #544421 prio=5 os_prio=0 cpu=0.10ms elapsed=712.35s tid=0x00007f2fc85419a0 nid=0xf0335 waiting for monitor entry [0x00007f2f2c1c0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.hp.nova.service.impl.DataFromRedis.DataFromRedisImpl$ThreadTask3ReportInstanceFromRedis.run(DataFromRedisImpl.java:1239)
- waiting to lock <0x0000000550e06cb0> (a java.lang.String)

"Thread-509214" #544428 prio=5 os_prio=0 cpu=0.12ms elapsed=706.60s tid=0x00007f2fc853e190 nid=0xf033d waiting for monitor entry [0x00007f2f2eae9000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.hp.nova.service.impl.DataFromRedis.DataFromRedisImpl$ThreadTask3ReportInstanceFromRedis.run(DataFromRedisImpl.java:1239)
- waiting to lock <0x0000000550e06cb0> (a java.lang.String)

"Thread-509221" #544435 prio=5 os_prio=0 cpu=0.11ms elapsed=704.43s tid=0x00007f2fc85385f0 nid=0xf0344 waiting for monitor entry [0x00007f2f2d6d5000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.hp.nova.service.impl.DataFromRedis.DataFromRedisImpl$ThreadTask3ReportInstanceFromRedis.run(DataFromRedisImpl.java:1239)
- waiting to lock <0x0000000550e06cb0> (a java.lang.String)

"Thread-509230" #544445 prio=5 os_prio=0 cpu=0.10ms elapsed=701.86s tid=0x00007f2fe4416810 nid=0xf034e waiting for monitor entry [0x00007f2f2acab000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.hp.nova.service.impl.DataFromRedis.DataFromRedisImpl$ThreadTask3ReportInstanceFromRedis.run(DataFromRedisImpl.java:1239)
- waiting to lock <0x0000000550e06cb0> (a java.lang.String)

"Thread-509252" #544467 prio=5 os_prio=0 cpu=0.10ms elapsed=678.16s tid=0x00007f2fc85396e0 nid=0xf0364 waiting for monitor entry [0x00007f2f2c7c6000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.hp.nova.service.impl.DataFromRedis.DataFromRedisImpl$ThreadTask3ReportInstanceFromRedis.run(DataFromRedisImpl.java:1239)
- waiting to lock <0x0000000550e06cb0> (a java.lang.String)

 

 

然后发现DataFromRedisImpl.java:1239

这里出现了锁竞争

 

private class ThreadTask3ReportInstanceFromRedis extends Thread {
private String taskcode;
private Integer taskversion;
private String rediskey;
public ThreadTask3ReportInstanceFromRedis(String taskcode ,Integer taskversion)
{
this.taskcode = taskcode;
this.taskversion=taskversion;
this.rediskey=reportinstanceredispre+taskcode+"."+taskversion;
}
public void run() {
synchronized(reportinstanceredispre){
try {
getTask3ReportInstanceFromRedis(taskcode, taskversion);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("error:{}", ExceptionUtil.stack(e));
}
}
}
}

 

 

 

然后改成如下方式,cpu明显下降很多,root cause是之前的代码可能是误写锁住了一个常量字符串,相当于整个method都锁了,改成下面的方式根据taskcode 和version减少了锁的粒度

synchronized(reportinstanceredispre)改为 synchronized(lock)






 

private static final Map<String, Object> locks = new ConcurrentHashMap<>();

private class ThreadTask3ReportInstanceFromRedis extends Thread {
private String taskcode;
private Integer taskversion;
private String rediskey;
public ThreadTask3ReportInstanceFromRedis(String taskcode ,Integer taskversion)
{
this.taskcode = taskcode;
this.taskversion=taskversion;
this.rediskey=reportinstanceredispre+taskcode+"."+taskversion;
}
public void run() {

Object lock = locks.computeIfAbsent(rediskey, key -> new Object());

synchronized(lock){
try {
logger.info("rediskey======{}",rediskey);
getTask3ReportInstanceFromRedis(taskcode, taskversion);
} catch (Exception e) {
// TODO Auto-generated catch block
logger.error("error:{}", ExceptionUtil.stack(e));
}
finally {
// 清理锁,避免内存泄漏
locks.remove(rediskey); // Clean up lock if no longer needed
}
}
}
}

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

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

相关文章

DC-5 靶场通关小记

rustscan端口扫描指纹识别、LFI漏洞+文件包含(nginx日志)GetShell、screen-4.5.0提权地址 https://www.vulnhub.com/entry/dc-5,314/环境配置 有兼容性问题参考 https://www.cnblogs.com/lrui1/p/18655388 信息收集 ./rustscan -a 192.168.74.130 -- -A -sC Open 192.168.74.13…

ABB IRB5500喷涂机械手维修细节查看

ABB IRB5500喷涂机器人的控制柜常见故障表现形式主要包括以下几种:1、控制柜不能启动:可能原因包括电源故障、控制电路板损坏、保险丝烧断等。处理方法包括检查电源是否正常、控制电路板是否有损坏迹象、保险丝是否烧断等。 2、abb涂装机械手控制柜报错或异常:可能原因包括…

新年新机遇:跨境电商选品策略大揭秘

跨境电商在进行新年选品时,需要综合考虑市场调研、竞争对手分析、品牌选择、价格定位、物流考虑、汇率研究、多元化产品线以及节日和特殊事件等多个因素。通过精心策划和准备,可以确保所选产品在新年期间取得良好的销售业绩。在进行跨境电商新年选品时,需要考虑多个因素以确…

年度重磅 |《2024华为开发者宝典》免费下载,多维度解读华为根生态技术

摘要:20多位华为云DTSE专家打造,10+技术领域全覆盖,图文干货+视频讲解,多维度解读华为根生态技术,拥抱技术变革,开启创新之旅。 一年一度!大家最期待的华为开发者宝典新鲜出炉!在刚刚过去的2024年,华为云开发者联盟通过25场精彩的DTSE Tech Talk直播活动,为广大开发者…

WPF页面中将一个控件的宽度绑定到其父级用户控件的实际宽度

通常情况下,使用相对宽度(如 * 星号单位)和适当的 HorizontalAlignment 是最简单有效的方法,可以确保子控件随着父控件的大小变化而自动调整。如果需要更精确的控制,可以考虑使用 RelativeSource 绑定或其他高级技术。确保父容器也支持子控件的动态尺寸调整非常重要。该实…

Windows 系统下 Docker 和 Docker Compose 安装配置:一键部署有来开源项目本地环境

在 Windows 系统上安装 Docker 和 Docker Compose,实现一键部署有来开源项目的本地环境,包括单体应用和微服务架构。🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: GitCod…

Openfiler iscsi共享存储连接访问配置

Openfiler、iscsi案例说明: 通过openfiler虚拟机模拟iscsi server建立存储共享,测试多路径(multipath)配置。 测试架构:iscsi server网络配置:一、通过firefox浏览器访问openfiler服务配置 1、连接服务配置失败2、修改TLS认证级别3、连接访问openfiler配置服务二、配置op…

SQL Server数据库备份、差异备份、日志备份脚本.250108

1,sp脚本 USE [master] GO /****** Object: StoredProcedure [dbo].[sp_BackupDatabase] Script Date: 2025/1/8 10:43:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO-- Author: Amadeus-- Create date: 2021-10-20 exec sp_BackupDatabase L-- Descrip…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年,是 JuiceFS 开源版本推出的第 4 年,企业版的第 8 个年头。回顾过去这一年,JuiceFS 社区版依旧保持着快速成长的势头,GitHub 星标突破 11.1K,各项使用指标增长均超过 100%,其中文件系统总数量较前一年更是增长了 8.5 倍;企业版同样持续保持高速增长,…

智慧防洪平台:构建城市安全的数字防线

随着全球气候变化的加剧和城市化进程的加快,城市防洪问题日益凸显。智慧防洪平台作为智慧城市建设的重要组成部分,其核心目标是通过集成先进的信息技术和数据分析,实现对城市洪涝灾害的有效预防和应对。本文将深入探讨智慧防洪平台的建设内容,以期为城市安全提供强有力的数…

如何通过数据分析优化电商营销策略和客户体验

一、电商数据的收集 电商平台的数据来源多样,包括用户行为数据、交易数据、客户反馈数据、商品信息数据等。高效的数据收集不仅是数据分析的前提,也是实现精准决策的基础。 1.1 数据收集的主要来源 用户行为数据:用户在电商平台上的每一次点击、浏览、搜索、加入购物车、下单…

CDS标准视图:安排维护计划的调用 I_MAINTENANCEPLANSCHEDULE

视图名称:安排维护计划的调用 I_MAINTENANCEPLANSCHEDULE 视图类型: 视图代码:点击查看代码 @AbapCatalog.compiler.compareFilter: true @AbapCatalog.sqlViewName: IMPLASCHED @AccessControl.authorizationCheck: #CHECK @ClientHandling.algorithm: #SESSION_VARIABLE @…