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

Java应用CPU飙升到900%?这套排查套路让你10分钟定位根因

在这篇文章中我将结合最近一次真实的生产事故分享一套经过实战检验的CPU排查方法论。这不是教科书上那些”用jstack查看线程栈”的泛泛之谈而是我们在72小时连续作战中总结出来的血泪经验。一、告警响应该做什么别急着重启很多团队的第一反应是”重启大法好”。但在没有定位问题之前重启就像是捂住温度计来”治疗”发烧——问题暂时消失了但根因还在而且你失去了最宝贵的现场信息。黄金5分钟应该做的事保留现场立即执行top -H -p pid保存线程CPU占用快照线程Dump连续执行3次jstack pid thread_dump_$(date %s).txt间隔5秒堆Dump如果CPU高伴随内存异常立即jmap -dump:live,formatb,fileheap.hprof pid监控数据截图或导出该时间段的JVM监控指标GC次数、堆使用率、线程数我们上次事故中就是因为运维同学”好心”地立即重启导致只能从日志中反推问题多花了4小时。二、定位CPU热点的三板斧2.1 第一板斧top jstack 定位高CPU线程# 1. 找出占用CPU最高的进程 top -c # 假设Java进程PID是12345 # 2. 查看该进程中各线程的CPU占用 top -H -p 12345 # 假设发现线程ID 12456占用CPU 80%关键技巧将十进制的线程ID转换为16进制因为jstack中的线程ID是nid0x十六进制# Linux/Mac printf %x\n 12456 # 输出: 30a8 # 然后在jstack输出中搜索 nid0x30a8 grep -A 20 nid0x30a8 thread_dump_*.txt真实案例中的发现payment-async-pool-32 #156 prio5 os_prio0 tid0x00007f8a4c0a8000 nid0x30a8 runnable [0x00007f89e1b4d000] java.lang.Thread.State: RUNNABLE at com.example.service.PaymentService.processPayment(PaymentService.java:187) at com.example.async.AsyncPaymentTask.run(AsyncPaymentTask.java:45) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)看起来是支付异步处理线程在运行但这正常吗继续深挖。2.2 第二板斧arthas profiler 生成火焰图jstack只能看到某一时刻的快照要找到真正的CPU热点需要采样分析。这里强烈推荐阿里开源的 arthas。# 启动arthas java -jar arthas-boot.jar # 选择目标Java进程后执行profiler profiler start --event cpu --duration 30 # 等待30秒采样... profiler getSamples # 查看采样数 profiler stop --format flamegraph --file cpu_flamegraph.html # 生成火焰图如何解读火焰图宽度代表CPU时间占比越宽说明占用CPU越多高度代表调用栈深度顶部平顶山通常是热点代码的标志在我们的案例中火焰图暴露了一个惊人的事实[Top 5 CPU consumers] 1. com.example.service.PaymentService.processPayment() - 45.2% └─ JSON.parseObject() - 38.7% └─ com.alibaba.fastjson.parser.deserializer.MapDeserializer.parseMap() - 35.1% 2. java.util.concurrent.LinkedBlockingQueue.poll() - 12.3% 3. java.lang.String.hashCode() - 8.9%问题定位PaymentService.processPayment()方法消耗了45%的CPU其中38.7%花在了JSON反序列化上2.3 第三板斧代码审查 性能分析打开PaymentService.java:187的代码// 问题代码已脱敏 public class PaymentService { private static final ObjectMapper objectMapper new ObjectMapper(); public PaymentResult processPayment(PaymentRequest request) { // 踩坑点1每次请求都解析JSON配置 String configStr redisTemplate.opsForValue().get(payment:config: request.getChannel()); MapString, Object config JSON.parseObject(configStr, new TypeReferenceMapString, Object() {}); // 踩坑点2在循环中进行JSON序列化 for (OrderItem item : request.getItems()) { String itemJson JSON.toJSONString(item); log.debug(Processing item: {}, itemJson); // 生产环境开了DEBUG日志 } // 踩坑点3大量字符串拼接 String key payment: request.getMerchantId() : request.getChannel() : System.currentTimeMillis(); // ... 业务逻辑 } }三个致命问题配置重复解析每笔支付请求都从Redis读取并解析JSON配置而这个配置每分钟才变一次DEBUG日志生产开启log.debug()虽然不会输出但参数计算JSON序列化仍然执行字符串拼接性能差在高频场景下字符串拼接产生大量临时对象三、性能优化的三把手术刀3.1 第一刀缓存预加载// 优化后代码 public class PaymentService { private static final ObjectMapper objectMapper new ObjectMapper(); // 使用Guava Cache缓存配置1分钟刷新一次 private final LoadingCacheString, MapString, Object configCache Caffeine.newBuilder() .maximumSize(100) .expireAfterWrite(1, TimeUnit.MINUTES) .build(this::loadConfig); private MapString, Object loadConfig(String channel) { String configStr redisTemplate.opsForValue().get(payment:config: channel); return JSON.parseObject(configStr, new TypeReferenceMapString, Object() {}); } public PaymentResult processPayment(PaymentRequest request) { // 优化1从本地缓存读取避免重复解析 MapString, Object config configCache.get(request.getChannel()); // 优化2生产环境避免JSON序列化使用占位符 if (log.isDebugEnabled()) { for (OrderItem item : request.getItems()) { log.debug(Processing item: {}, item); // 直接打印对象由日志框架处理 } } // 优化3使用StringBuilder或String.format String key String.format(payment:%s:%s:%d, request.getMerchantId(), request.getChannel(), System.currentTimeMillis()); // ... 业务逻辑 } }性能对比数据基于JMeter 1000并发压测指标优化前优化后提升平均RT2876ms89ms97%CPU使用率900%120%87%QPS347892025倍99%延迟5632ms156ms97%3.2 第二刀异步化 线程池隔离在排查过程中我们还发现另一个问题支付回调处理是同步阻塞的导致Tomcat线程池耗尽。// 优化方案使用线程池隔离 异步处理 Configuration public class AsyncConfig { Bean(paymentExecutor) public ThreadPoolTaskExecutor paymentExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); executor.setMaxPoolSize(100); executor.setQueueCapacity(500); executor.setThreadNamePrefix(payment-async-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } } Service public class PaymentCallbackService { Async(paymentExecutor) public CompletableFutureCallbackResult processCallback(CallbackRequest request) { // 耗时的回调处理逻辑 return CompletableFuture.supplyAsync(() - { // 1. 验签 // 2. 更新订单状态 // 3. 发送通知 return new CallbackResult(); }); } }3.3 第三刀JVM参数调优针对高并发场景我们还需要调整JVM参数# 优化后的JVM参数 -Xms4g -Xmx4g # 堆内存固定避免动态扩容 -XX:UseG1GC # 使用G1垃圾收集器 -XX:MaxGCPauseMillis200 # 目标GC暂停时间 -XX:ParallelRefProcEnabled # 并行处理Reference -XX:DisableExplicitGC # 禁止显式GC -XX:HeapDumpOnOutOfMemoryError # OOM时自动dump -XX:HeapDumpPath/data/logs/heapdump.hprof四、避坑指南这些坑我们替你踩过了坑1fastjson的autoType坑// 危险代码 JSON.parseObject(jsonString, Object.class); // 可能触发autoType漏洞 // 安全做法 ParserConfig.getGlobalInstance().setAutoTypeSupport(false); JSON.parseObject(jsonString, new TypeReferencePaymentRequest() {}, Feature.DisableCircularReferenceDetect);坑2线程池队列无界导致OOM// 危险LinkedBlockingQueue默认Integer.MAX_VALUE new ThreadPoolExecutor(10, 100, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); // 队列长度21亿 // 正确限制队列大小 new ThreadPoolExecutor(10, 100, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(1000)); // 最多1000个待处理任务坑3arthas在线调试影响性能arthas的watch、trace等命令会对方法调用进行增强生产环境慎用我们曾经因为在生产开启trace命令导致性能下降30%。正确做法使用profiler命令基于async-profiler性能影响%限制采样时间30秒~1分钟调试完成后立即stop或quit五、监控体系建设让问题可视化光有排查手段还不够我们需要在问题发生前就建立监控体系5.1 JVM监控指标# Prometheus Grafana 监控配置示例 jvm_metrics: - jvm_memory_used_bytes{areaheap} - jvm_gc_pause_seconds_sum - jvm_threads_current - jvm_cpu_usage_ratio alert_rules: - alert: HighCPUUsage expr: jvm_cpu_usage_ratio 0.8 for: 2m annotations: summary: CPU使用率超过80% - alert: HighThreadCount expr: jvm_threads_current 500 for: 1m annotations: summary: 线程数超过5005.2 应用层监控// 使用Micrometer埋点 Service public class PaymentService { private final MeterRegistry meterRegistry; private final Timer processTimer; public PaymentService(MeterRegistry meterRegistry) { this.meterRegistry meterRegistry; this.processTimer Timer.builder(payment.process.duration) .description(Payment processing time) .register(meterRegistry); } public PaymentResult processPayment(PaymentRequest request) { return processTimer.recordCallable(() - { // 业务逻辑 return doProcess(request); }); } }六、总结经验建立排查SOP经过这次事故我们团队总结了CPU问题的排查SOP标准操作流程Phase 1: 紧急响应0-5分钟保留现场thread dump, heap dump, 监控截图通知相关人开发、运维、业务评估影响范围是否影响核心业务Phase 2: 快速止血5-15分钟如果有重启窗口灰度重启1台服务器观察如果有降级开关立即降级非核心功能扩容如果是资源不足Phase 3: 根因分析15分钟-2小时使用top jstack定位高CPU线程使用arthas生成火焰图代码审查 日志分析Phase 4: 长期优化事后修复代码问题完善监控告警压测验证复盘总结七、工具箱推荐最后分享一下我们的CPU排查工具箱工具用途性能影响top/htop实时查看进程/线程CPU占用无jstack线程栈快照低会触发Safepointarthas在线诊断profiler/watch/traceprofiler %, 其他命令较高async-profiler生成火焰图arthas底层使用%JProfilerIDE级性能分析需离线分析高不适合生产Prometheus Grafana监控 告警低结语CPU飙升问题并不可怕可怕的是遇到问题时手忙脚乱、无从下手。建立一套标准化的排查流程配备合适的工具才能在关键时刻快速定位问题。记住重启不是解决方案保留现场才能根治问题。

相关文章:

Java应用CPU飙升到900%?这套排查套路让你10分钟定位根因

在这篇文章中,我将结合最近一次真实的生产事故,分享一套经过实战检验的CPU排查方法论。这不是教科书上那些”用jstack查看线程栈”的泛泛之谈,而是我们在72小时连续作战中总结出来的血泪经验。 一、告警响应该做什么?别急着重启&…...

ML模型生产部署:从Jupyter到高可用推理服务的工程化实践

1. 项目概述:当模型走出Jupyter,真正开始呼吸真实世界空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号,专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在部署时被生产环境…...

强烈推荐!这个 Skill 画架构图质量超高,一句话出图

做技术这行,总有些事是真心懒得做的,画架构图算一个。 不是不重要,是太麻烦。要么打开 http://draw.io 从头拖组件,要么用 Mermaid 写一堆语法还要反复调位置,最后搞出来的效果差强人意,发给别人一看&…...

云厂商AI基础设施争夺战:Bedrock、Azure AI Studio与Vertex AI深度对比

1. 项目概述:一场没有硝烟的AI基础设施争夺战你打开云厂商控制台,发现“Bedrock”“Azure AI Studio”“Vertex AI”这些名字突然变得比以前更醒目;你翻看技术团队的采购清单,GPU实例价格单旁多了一行加粗标注:“含专属…...

3D-LLM:面向可制造性的三维语言模型技术解析

1. 项目概述:当大语言模型开始“看见”三维空间“From Text to Tangible: 3D-LLM Unleashes Language Models into the 3D World”——这个标题不是科幻小说的副标题,而是2024年真实出现在CVPR和ICML顶会workshop上的技术路线宣言。我第一次在arXiv上读到…...

【独家首发】Sora 2 v1.3.2内部一致性补丁文档泄露:仅限前500位AIGC工程师的8项prompt-engineering硬核干预法

更多请点击: https://intelliparadigm.com 第一章:Sora 2人物一致性保持的核心挑战与底层机制 在长时序视频生成任务中,Sora 2需在数十秒甚至更长的视频序列中维持同一人物的外观、姿态、服饰、发型及微表情等多维度特征稳定复现。这一目标面…...

LLM语言大模型的企业应用案例

本文系统梳理 2025-2026 年国内外 7 款主流大语言模型(LLM)在企业中的成功部署案例,覆盖金融、汽车、旅游、政务、医疗五大行业,每个案例均包含部署步骤、数据准备、改善效果数字及经验教训,为企业 AI 落地提供可借鉴的…...

Sora 2生成3分钟以上视频总卡顿、跳帧?:5步精准定位帧间语义断裂点并修复

更多请点击: https://codechina.net 第一章:Sora 2生成3分钟以上视频总卡顿、跳帧?:5步精准定位帧间语义断裂点并修复 长时序视频生成中,Sora 2 在输出超过180秒内容时频繁出现视觉跳变、运动不连贯及语义突兀中断&am…...

长期使用Taotoken的Token Plan套餐在成本控制上的实际效果

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken的Token Plan套餐在成本控制上的实际效果 在项目开发与测试阶段,模型API的调用成本是团队需要持续关注…...

校园便利|基于java+vue的校园便利平台(源码+数据库+文档)

校园便利平台 基于SprinBootvue的校园便利平台 一、前言 二、系统设计 三、系统功能设计 系统前台实现 系统首页功能 用户后台管理功能 管理员功能实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍…...

根据(2022年版课程标准修订)义务教育教科书·七至八年级生物课程内容体系,直接打印快速记忆

七年级生物目录(上册)第一单元 生物和细胞第一章 认识生物第一节 观察周边环境中的生物第二节 生物的特征第二章 认识细胞第一节 学习使用显微镜第二节 植物细胞第三节 动物细胞第四节 细胞的生活第三章 从细胞到生物体第一节 细胞通过分裂产生新细胞第二…...

MySQL 性能监控实战:从零搭建 Prometheus + Grafana 监控告警体系(附排查 SOP)

📌 今日关键词:性能监控、PMM、Prometheus、Grafana、慢查询、告警、指标体系 大家好,我是数据库小学妹 👋 前面我们学习了锁机制、MVCC、慢查询诊断这些"事后分析"的技术。但你知道“数据库目前处于什么状态&#xff1…...

借助AI写教材,低查重实现,轻松打造符合需求的教材!

教材编写的挑战与AI工具解决方案 在教材编写的过程中,如何平衡原创性与合规性是一个重要的挑战。借鉴优秀教材的知识内容时,常常会担心重复率过高;而自己独立表述知识点,又得顾虑逻辑不严密、内容不准确等问题。引用他人研究成果…...

Oracle替代之路:企业去O过程中常见的坑与避坑指南

📌 关键词:Oracle替代、国产数据库、去O、数据库迁移、信创、兼容性、高可用大家好!我是数据库小学妹 👋 最近发现一个有意思的现象:不管是金融、运营商还是政务单位,聊到数据库规划,三句话不离…...

AI教材编写攻略:低查重AI工具实测,轻松生成25万字优质教材!

AI教材写作工具助力教学资源创作 在撰写教材的过程中,资料的支持是必不可少的,但传统的资料整合方式已经无法满足当前的需求。以前,我们需要从各个渠道,比如课标文件、学术文章和教学实例,去花费几天时间筛选出有价值…...

如何通过精细风扇控制优化Windows电脑的散热与静音体验

如何通过精细风扇控制优化Windows电脑的散热与静音体验 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanContro…...

DataRoom开源大屏设计器:零代码打造专业数据可视化大屏的终极指南

DataRoom开源大屏设计器:零代码打造专业数据可视化大屏的终极指南 【免费下载链接】DataRoom 🔥基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器,具备目录管理、DashBoard设计、预览能力,支持MySQL…...

如何快速上手Udeler:新手必看的完整Udemy课程下载指南

如何快速上手Udeler:新手必看的完整Udemy课程下载指南 【免费下载链接】udemy-downloader-gui A desktop application for downloading Udemy Courses 项目地址: https://gitcode.com/gh_mirrors/ud/udemy-downloader-gui 想要随时随地学习你购买的Udemy课程…...

东南大学论文模板终极指南:8倍效率完成毕业论文格式排版

东南大学论文模板终极指南:8倍效率完成毕业论文格式排版 【免费下载链接】SEUThesis 东南大学论文模板 项目地址: https://gitcode.com/gh_mirrors/seu/SEUThesis 东南大学论文模板(SEUThesis)是东南大学官方验证的学术论文格式解决方…...

跨境商城反向海淘系统开发全流程逻辑(上)

「技术、数据、接口、系统问题欢迎留言私信沟通」跨境商城开发不同于普通国内商城,核心逻辑是“合规适配功能闭环多场景兼容”,不仅要实现商品展示、下单支付等基础功能,更要兼顾不同国家的法律法规、文化差异、支付物流适配等核心痛点。本文…...

观察Taotoken在多模型聚合调用时的路由与容错表现

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察Taotoken在多模型聚合调用时的路由与容错表现 在构建依赖大模型能力的应用时,服务的稳定性是开发者关心的核心问题…...

程序员35岁以后最好的投资:不是买房,是这3样东西

当“35岁红线”撞上测试人的职业围城如果你在某个深夜刷到“程序员35岁以后该何去何从”的帖子时,心底划过一丝隐痛,那你绝不是一个人。而对于软件测试从业者而言,这种焦虑往往被放大得更加具体——当“点点点”的手工测试逐渐被自动化替代&a…...

解决RTL8821CU无线网卡在Linux下的3大痛点:从识别到稳定连接的全攻略

解决RTL8821CU无线网卡在Linux下的3大痛点:从识别到稳定连接的全攻略 【免费下载链接】rtl8821CU Realtek RTL8811CU/RTL8821CU USB Wi-Fi adapter driver for Linux 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8821CU 你是否曾经在Linux系统上连接RTL…...

贡献指南 | 参与 Harmonybrew 开源社区共建规范

贡献指南 | 参与 Harmonybrew 开源社区共建规范 欢迎大家加入鸿蒙PC社区 Harmonybrew 是面向 OpenHarmony/鸿蒙系统的 Homebrew 移植开源项目,依托多仓库协作模式,实现包管理器适配、软件包移植、工具适配、文档维护等全链路能力。为规范社区贡献流程、…...

ubuntu 播放器 播放此文件需要H.264(high profile)解码器,但是没有安装

解决方法: sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav...

18 CLIP 论文精读:ViT 如何走向图文多模态?(Learning Transferable Visual Models From Natural Language Supervision)

在前几篇文章中,我们围绕 ViT 的自监督预训练路线进行了连续梳理。MAE 的核心思想是:遮住大部分图像 patch,让模型重建被遮挡区域的像素。BEiT 的核心思想是:先用视觉 tokenizer 把图像转换成离散 visual token,再让模…...

【ChatGPT×Slack企业级整合实战指南】:20年SRE亲授零代码接入、权限治理与合规审计全流程

更多请点击: https://kaifayun.com 第一章:ChatGPTSlack企业级整合的战略价值与落地全景 将ChatGPT深度集成至Slack平台,已从技术实验演进为驱动组织协同效能跃迁的核心基础设施。该整合并非简单Bot接入,而是通过语义理解、上下文…...

面试必问:RAG准确率提升实战:从60%到85%的全链路优化

✅ 面试官您好,关于如何将 RAG 系统的准确率从 60% 提升到 85%,我认为这不是一个简单的调参问题,而是一场贯穿数据、检索、生成、评估全链路的系统性工程。我通常会按照“诊断 → 优化 → 验证”三步走策略来推进,具体如下&#x…...

AI教材生成秘籍!AI写教材工具助力,快速产出低查重优质教材!

2026年AI教材编写工具:解决教材创作难题 整理教材中的知识要点可谓是一项“精细的工作”,这其中的挑战在于如何平衡和衔接这些知识点。我们经常会为核心知识点的遗漏而烦恼,同时也很难掌握难度的梯度——小学教材可能写得过于复杂&#xff0…...

SNK施努卡铜箔包装线:从拔轴到入库,全流程自动化怎么实现?

在锂电铜箔生产中,生箔机产出的铜箔卷需要经过裁切、拔轴、包装、入库等多个环节。传统方式下,拔轴依靠人力或简易机械,包装过程需要多人配合搬运、开箱、投干燥剂、合盖捆扎,不仅效率低,而且容易损伤铜箔边缘&#xf…...