[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决
Spring Boot服务CPU 100%问题排查:从定位到解决
1. 引言
当Spring Boot服务出现CPU占用率100%时,系统性能会急剧下降,甚至导致服务不可用。本文将通过真实代码案例,详细讲解如何快速定位问题根源,并提供解决方案。无论是死循环、线程阻塞还是资源泄漏,本文帮你一网打尽!
2. 问题现象
- 服务器CPU使用率持续100%
- 接口响应时间变长或超时
- 通过监控工具(如Grafana、Arthas)发现异常线程
3. 排查步骤
3.1 编写测试代码

3.2 运行代码效果



3.3 定位高CPU进程
使用top命令快速找到占用CPU最高的Java进程:
top -c # 显示完整命令,找到PID
终端输入命令:top -c,找到高cpu进程PID:420364

3.4 定位高CPU线程
通过top -Hp <PID>查看进程内线程的CPU使用情况,记录线程ID(需转换为十六进制):
#查找进程中的线程
top -Hp <PID>top -Hp 420364# 假设线程ID为433127 → 69be7 输出为16进制printf "%x\n" 433127 [root@localhost java]# printf "%x\n" 433127
69be7
终端输入命令:top -Hp 420364,定位高cpu线程:433127
线程ID转换为16进制:69be7
生成堆栈信息:jstack 420364 > stack.log 生成时PID:420364
通过堆栈信息分析:grep -A 20 ‘nid=0x69be7’ stack.log nid=0x69be7为线程id
根据信息对比原代码可找到问题

3.5分析线程堆栈
使用jstack捕获线程堆栈并分析:
#生成线程堆栈
jstack <PID> > stack.logjstack 420364 > stack.log# 搜索特定线程
grep -A 20 'nid=0x69be7' stack.log


排查结果及源代码问题对比:类32行运行结果导致cpu 100%

3.5 Arthas 工具定位
以上是根据Java自带的jstack 工具定位, Arthas 工具也能定位排查。定位思路和上面步骤一致
#安装下载启动
curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar
启动选择需要定位项目:2

直接输入查看高cpu线程: thread

查看堆栈信息找到代码问题: thread 29 (线程ID)

如果想看实时面板信息: dashboard

4. 常见原因与代码示例
4.1 死循环(While循环未正确退出)
问题代码:
@Service
public class CpuProblemController {public void deadLoop() {while (true) { // 无条件退出,导致死循环// 业务逻辑(如未正确更新循环条件)}}
}
解决方案:
@Service
public class CpuProblemController {private volatile boolean running = true; // 添加退出标志public void deadLoop() {while (running) { // 通过控制running变量退出循环// 业务逻辑}}@PreDestroypublic void stop() {running = false; // 服务关闭时触发退出}
}
测试完整类:
package com.example.controller;import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PreDestroy;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@RestController
@RequestMapping("/pro")
public class CpuProblemController {// 添加退出标志private volatile boolean running = true;// 创建线程池private final ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());/*** 死循环:模拟 CPU 占满*/@PostMapping("/deadLoop")public void deadLoop() {// 启动多个线程,每个线程执行死循环for (int i = 0; i < Runtime.getRuntime().availableProcessors(); i++) {executorService.submit(() -> {while (running) {// 死循环,模拟高 CPU 使用率System.out.println("=======死循环=========");// 加入计算密集型任务for (int j = 0; j < 1000000; j++) {Math.sin(j); // 计算密集型操作}}});}}@PreDestroypublic void stop() {// 服务关闭时触发退出running = false;executorService.shutdownNow(); // 关闭线程池}
}
4.2 不合理递归(栈溢出与CPU飙升)
问题代码:
public class RecursionController {public int faultyRecursion(int n) {return n + faultyRecursion(n - 1); // 无终止条件 → 无限递归}
}
解决方案:
public class RecursionController {public int safeRecursion(int n) {if (n <= 0) { // 添加递归终止条件return 0;}return n + safeRecursion(n - 1);}
}
4.3 线程池未正确关闭(资源泄漏)
问题代码:
@RestController
public class ThreadController {private ExecutorService executor = Executors.newFixedThreadPool(10);@GetMapping("/task")public String submitTask() {executor.submit(() -> {while (true) { // 线程池任务未终止// 长时间运行的任务}});return "Task submitted!";}// 未重写destroy方法关闭线程池 → 线程泄漏
}
解决方案:
@RestController
public class ThreadController {private ExecutorService executor = Executors.newFixedThreadPool(10);@GetMapping("/task")public String submitTask() {executor.submit(() -> {while (!Thread.currentThread().isInterrupted()) { // 检查中断状态// 可中断的任务逻辑}});return "Task submitted!";}@PreDestroypublic void shutdown() {executor.shutdownNow(); // 服务关闭时终止线程池}
}
4.4 锁竞争(线程阻塞与自旋)
问题代码:
public class LockCompetitionController {private final Object lock = new Object();public void highCpuMethod() {synchronized (lock) {// 长时间持有锁(如复杂计算或IO操作)try {Thread.sleep(10000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}}}
}
解决方案:
public class LockCompetitionDemo {private final Object lock = new Object();public void optimizedMethod() {// 缩小锁范围,只锁必要部分heavyCalculation(); // 将非线程安全操作移到锁外synchronized (lock) {// 仅保护共享资源}}private void heavyCalculation() {// 复杂计算逻辑}
}
4.5 频繁GC(内存泄漏导致CPU飙升)
问题代码:
public class MemoryLeakDemo {private static List<byte[]> cache = new ArrayList<>();@GetMapping("/leak")public void leakMemory() {while (true) {cache.add(new byte[1024 * 1024]); // 不断添加数据 → 触发Full GC}}
}
解决方案:
public class MemoryLeakDemo {private static final int MAX_CACHE_SIZE = 100;private static List<byte[]> cache = new ArrayList<>();@GetMapping("/safe")public void safeMethod() {if (cache.size() >= MAX_CACHE_SIZE) {cache.clear(); // 定期清理缓存}cache.add(new byte[1024 * 1024]);}
}
5. 总结与预防
- 代码审查:重点关注循环、递归、线程池和锁的使用。
- 压测与监控:使用JMeter模拟高并发,通过Arthas实时监控CPU。
- 防御式编程:对递归添加终止条件,对循环添加超时机制。
- 工具辅助:利用
jvisualvm或async-profiler进行性能分析。
希望这篇文章对你有所帮助!如果觉得不错,别忘了点赞收藏哦!
相关文章:
[Java实战]Spring Boot服务CPU 100%问题排查:从定位到解决
Spring Boot服务CPU 100%问题排查:从定位到解决 1. 引言 当Spring Boot服务出现CPU占用率100%时,系统性能会急剧下降,甚至导致服务不可用。本文将通过真实代码案例,详细讲解如何快速定位问题根源,并提供解决方案。无…...
1.6 极限存在准则
1.夹逼定理(迫敛定理) 1.1 数列型 1.1.1 准则 1.2 函数型 2. 两个重要极限...
Fisher信息、梯度方差与学习率调度器的计算流程
Fisher信息、梯度方差与学习率调度器的计算流程 目录 Fisher信息、梯度方差与学习率调度器的计算流程**步骤1:定义模型与数据集****步骤2:计算梯度与Fisher信息****步骤3:计算梯度方差****步骤4:定义学习率调度器****步骤5:参数更新流程****示例输出****关键概念说明**步骤…...
Model Context Protocol 的生命周期
生命周期阶段 生命周期分为三个主要阶段: 初始化阶段 (Initialization) 客户端与服务器建立协议版本兼容性。交换并协商能力。分享实现细节。客户端必须发送 initialize 请求,包含支持的协议版本、客户端能力和客户端实现信息。服务器必须响应其自身能力…...
Go语言中的错误处理与异常恢复:性能对比与实践思考
Gone是一款轻量级Go依赖注入框架,通过简洁的标签声明实现自动组件管理。它提供零侵入设计、完整生命周期控制和极低运行时开销,让开发者专注于业务逻辑而非依赖关系处理。 项目地址: https://github.com/gone-io/gone 文章目录 Go的错误处理哲…...
CSS 属性选择器详解
CSS 属性选择器详解 引言 CSS(层叠样式表)是网页设计中的重要组成部分,它用于控制网页元素的样式和布局。属性选择器是CSS选择器的一种,它允许开发者根据元素的特定属性来选择和样式化元素。本文将详细讲解CSS属性选择器的概念、语法以及常用属性选择器的使用方法。 一、…...
大华SDK协议在智联视频超融合平台中的接入方法
一. 大华SDK协议详解 (一)、大华SDK协议概述 大华SDK(Software Development Kit)协议是大华股份为开发者提供的一套软件开发工具包,旨在帮助开发者快速集成大华设备(如摄像头、NVR、DVR等)的功…...
卓越的用户体验需要智能内容
摘要:这篇文章指出静态文档已无法满足现代用户的需求,而智能内容则是构建卓越用户体验的关键。文章从智能内容的定义、优势和实际应用等方面进行了详细阐述,并强调了企业应积极拥抱智能内容,以提升客户满意度、降低成本并创造新的…...
【蓝桥杯】1124修建公路1(Kruskal算法)
思路 找到能够连通所有城市的最小树即可,可用Prim或Kruscal。 !!注意,m的范围是包括0的,可就是包含没有道路的情况,要单独输出0 code import os import sys# 输入 n,m map(int,input().split()) road …...
传感云揭秘:边缘计算的革新力量
在当今快速发展的科技时代,传感云和边缘计算系统正逐渐成为人们关注的焦点。传感云作为物联网与云计算的结合体,通过虚拟化技术将物理节点转化为多个服务节点,为用户提供高效、便捷的服务。而边缘计算则是一种靠近数据源头或物端的网络边缘侧…...
Bigemap Pro 的三种地图下载方式
地图下载通常是是最基础但也最重要的任务之一,无论是进行空间分析、制作专题地图,还是进行数据可视化,高质量的地图数据都是不可或缺的。Bigemap Pro提供了三种地图下载方式,分别适用于不同的场景和需求。无论是免费版用户还是专业…...
Python直方图:从核密度估计到高维空间解析
一、直方图的核心原理与数学本质 数据分布的视觉解码器 直方图(Histogram)是数据科学家的"分布显微镜",通过将连续数据划分为等宽区间(Bin),统计各区间的频数/频率,用相邻矩形条直观…...
0基础 | 恒流源专题
目录 tip1:低端反馈编辑 tip2: 恒流源电路的设计注意事项 tip3:三极管输出恒定电流受运放输出电流控制 tip4:高端反馈 基本逻辑: 当负端Vref不输入电压时, 当负端Vref输入电压时 tip1:低端反馈 判…...
Cannl 数据同步-ES篇
Cannl 数据同步 目录 Cannl 数据同步一、概述1、简介2、原理3、模块 二、配置MySQL1、使用版本使用版本 2、环境要求1)操作系统2)MySQL要求 三、配置Canal-server1、下载安装2、**修改配置****单机配置****集群配置****分库分表配置** 四、配置canal-ada…...
Webpack 前端性能优化全攻略
文章目录 1. 性能优化全景图1.1 优化维度概览1.2 优化效果指标 2. 构建速度优化2.1 缓存策略2.2 并行处理2.3 减少构建范围 3. 输出质量优化3.1 代码分割3.2 Tree Shaking3.3 压缩优化 4. 运行时性能优化4.1 懒加载4.2 预加载4.3 资源优化 5. 高级优化策略5.1 持久化缓存5.2 模…...
时间序列分析的军火库:AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS解析
引言:时间序列分析的现代挑战 时间序列分析在多个领域中扮演着关键角色,包括工程、金融、气象、工业预测等。随着开源工具的快速发展,开发者可以通过多种库快速实现时间序列预测与分析。本文将对 AutoTS、Darts、Kats、PaddleTS、tfts 和 FancyTS 六大主流库进行详细解析,…...
MySQL意向锁我该怎么理解?
在MySQL中,意向锁(Intention Lock)是一种用于协调不同粒度锁(如表锁和行锁)的机制,其核心目的是在保证数据一致性的同时提高并发性能。以下是关于意向锁的详细解析: 一、意向锁的作用 意向锁的…...
Linux 操作系统简介
Linux 操作系统 Linux 是一种自由和开源的操作系统,最初由芬兰的 Linus Torvalds 在1991年创建。它是一个类 Unix 操作系统,广泛用于服务器、个人电脑和嵌入式设备。Linux 操作系统的核心是 Linux 内核,其周围构建了各种工具和应用程序&…...
前端大文件上传(分片上传)与下载
文章目录 一、问题二、思路1、选择文件2、校验文件是否符合规范3、文件切片上传4、分片上传注意点5、大文件下载 一、问题 日常业务中难免出现前端需要向后端传输大型文件的情况,这时单次的请求不能满足传输大文件的需求,就需要用到分片上传 业务需求为…...
工业领域 - 离散工业与流程工业极简理解
离散工业 离散工业是指通过组装或加工离散的零部件来生产产品 离散工业生产的是可数的、独立的产品 离散工业的每个产品通常由多个部件组成,生产过程可以分解为多个独立的步骤 离散工业生产过程主要涉及组装和加工,组装是将多个零部件组装成最终产品&…...
一个使用Python和相关深度学习库(如`PyTorch`)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例
以下是一个使用Python和相关深度学习库(如PyTorch)实现GCN(图卷积网络)与PPO(近端策略优化)强化学习模型结合的详细代码示例。这个示例假设你在一个图环境中进行强化学习任务。 1. 安装必要的库 确保你已…...
【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet
主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: 【YOLOv8】YOLOv8结构解读…...
CCF CSP 第30次(2023.05)(1_仓库规划_C++)
CCF CSP 第30次(2023.05)(1_仓库规划_C) 题目描述:输入格式:输出格式:样例输入:样例输出:样例解释:子任务:解题思路:思路一࿱…...
【LangChain】理论及应用实战(7):LCEL
文章目录 一、LCEL简介二、LCEL示例2.1 一个简单的示例2.2 RAG Search 三、LCEL下核心组件(PromptLLM)的实现3.1 单链结构3.2 使用Runnables来连接多链结构3.2.1 连接多链3.2.2 多链执行与结果合并3.2.3 查询SQL 3.3 自定义输出解析器 四、LCEL添加Memor…...
Leetcode 刷题笔记1 单调栈part02
leetcode 42 接雨水 本题用双指针法更为浅显易懂 双指针法: class Solution:def trap(self, height: List[int]) -> int:leftheight, rightheight [0] * len(height), [0] * len(height)ans 0leftheight[0] height[0]for i in range(1, len(height)):lefth…...
ai本地化 部署常用Ollama软件
现在用最简单的方式介绍一下 Ollama 的作用和用法: Ollama 是什么? Ollama 是一个让你能在自己电脑上免费运行大型语言模型(比如 Llama 3、Mistral 等)的工具。 相当于你本地电脑上有一个类似 ChatGPT 的 AI,但完全…...
vllm部署QwQ32B(Q4_K_M)
vllm部署QwQ32B(Q4_K_M) Ollama是一个轻量级的开源LLM推理框架,注重简单易用和本地部署,而VLLM是一个专注于高效推理的开源大型语言模型推理引擎,适合开发者在实际应用中集成和使用。两者的主要区别在于Ollama更注重为用户提供多种模型选择和…...
VLLM:虚拟大型语言模型(Virtual Large Language Model)
VLLM:虚拟大型语言模型(Virtual Large Language Model) VLLM指的是一种基于云计算的大型语言模型的虚拟实现。它通常是指那些由多个服务器组成的分布式计算环境中的复杂机器学习模型,这些模型能够处理和理解大量的文本数据。VLLM的…...
企业内网监控软件的选型与应用:四款主流产品的深度剖析
在数字化办公的时代背景下,企业内部网络管理的重要性愈发显著。对于企业管理者而言,如何精准掌握员工工作状态,保障网络安全与工作效率,已成为亟待解决的关键问题。本文将深入剖析四款主流企业内网监控软件,探讨其功能…...
蓝桥杯省赛(2024)
问题描述 小蓝和朋友们在玩一个报数游戏。由于今年是 20242024 年,他们决定要从小到大轮流报出是 2020 或 2424 倍数的正整数。前 1010 个被报出的数是:20,24,40,48,60,72,80,96,100,12020,24,40,48,60,72,80,96,100,120。请问第 2024202420242024202420…...
