Spring Boot 启动或请求卡顿:从 Bean 锁、事件广播到连接池
Spring Boot 启动或请求卡顿从 Bean 锁、事件广播到连接池Spring Boot 卡顿时先看线程在做什么。CPU 低可能是锁、连接池或同步 I/O 等待CPU 高也可能是分配、序列化或业务循环。扩容和调堆都应放在证据之后。模拟卡顿场景与诊断决策树把 CPU、P99、吞吐和线程状态放在同一时间窗口。低 CPU 与高延迟只能提示可能存在等待仍要用线程转储、JFR 和连接池指标确认是BLOCKED、WAITING还是下游响应慢。源码级卡顿原因深度剖析通过对 Spring Boot 内部核心组件的源码拆解可以定位到以下容易引发卡顿的机制陷阱1. Spring 单例 Bean 注册锁竞争在 Spring 容器中单例 Bean 的创建与获取依赖DefaultSingletonBeanRegistry类。在其底层实现中为了保证多线程下 Bean 的单例特性采用了singletonObjectsConcurrentHashMap 配合synchronized(this.singletonObjects)互斥锁。// Spring 源码切片: DefaultSingletonBeanRegistry.java public Object getSingleton(String beanName, ObjectFactory? singletonFactory) { synchronized (this.singletonObjects) { Object singletonObject this.singletonObjects.get(beanName); if (singletonObject null) { // 走 Bean 实例化、属性填充、初始化回调流程 singletonObject singletonFactory.getObject(); this.singletonObjects.put(beanName, singletonObject); } return singletonObject; } }如果在运行期由于动态懒加载Lazy Init或原型作用域Prototype交叉引用频繁触发 Bean 实例化过程该互斥锁会导致所有尝试获取 Bean 的线程发生强烈的锁竞争使得 Worker 线程被批量挂起。2. Spring Event 同步广播的“串行阻塞”效应Spring Boot 默认提供的事件发布机制ApplicationEventPublisher是纯同步的。在SimpleApplicationEventMulticaster内部当调用multicastEvent()方法时框架会依次遍历所有匹配的ApplicationListener并同步执行onApplicationEvent()。若某个事件监听器中包含了耗时较长的操作例如发送邮件、记录远程审计日志或调用第三方 HTTP 接口主业务线程将被迫等待该监听器执行完毕。一旦第三方接口延时主线程便会直接在事件发布处发生卡顿。3. HikariCP 连接池等待与连接泄露作为 Spring Boot 默认的数据库连接池HikariCP 依靠极高的性能著称。但当连接池中的连接被耗尽时HikariPool.getConnection()会在HandOffQueue上调用poll()并等待connectionTimeout默认 30 秒。若业务代码中存在未显式关闭 ResultSet / Statement或者事务方法中包含了耗时的网络 RPC导致连接无法及时归还后续线程将全部卡在getConnection()方法上表现为极高的响应延迟。排查工具链与定位步骤在面对真实卡顿故障时应当按照以下工程步骤顺序操作步骤使用工具执行命令 / 方法诊断目的1jstackjstack -l pid threads.txt连续抓取 3 次线程栈对比TIMED_WAITING与BLOCKED状态的线程集中在哪个方法2Arthasthread -b自动找出当前阻塞其他线程最多的锁持有者线程3Arthastrace com.example.service.* getOrderDetail动态插桩输出方法内部各个子方法的精确执行耗时4Prometheushikaricp_pending_threadsMetrics监测数据库连接池当前排队等待连接的线程数量卡顿防御与优化防坑 CheckList为 ApplicationEventMulticaster 配置异步 TaskExecutor在配置类中重写applicationEventMulticasterBean注入异步线程池避免监听器阻塞主业务线程。核对事务中的外联 RPC等待 RPC 时事务可能继续占用数据库连接或持有锁放大连接池等待。能否移出事务取决于一致性要求可用本地事务 事件、Outbox 或补偿流程重画边界并验证失败和重复处理。按需开启 HikariCP 泄露监测leak-detection-threshold应高于正常事务耗时并考虑采集开销。它提示连接借出过久不等同于已经证明泄漏。注意代理内部调用同一 Bean 通过this调用带Async或Transactional的方法通常不会经过代理。需要拆分 Bean 或显式调整调用边界并写测试确认事务与异步行为。

相关新闻

Postman Cookie清理全攻略:精准管理会话状态,提升API测试可靠性

Postman Cookie清理全攻略:精准管理会话状态,提升API测试可靠性

1. 项目概述:为什么我们需要关注Cookie清理 在API开发和测试的日常工作中,Postman几乎是每个开发者手边不可或缺的工具。它让我们能够快速构建、发送请求并查看响应,极大地提升了前后端联调和接口自测的效率。然而,随着测试的深入…

2026/10/18 15:15:58 阅读更多 →
POMDP框架:驱动智能搜索从被动响应到主动探索的决策核心

POMDP框架:驱动智能搜索从被动响应到主动探索的决策核心

1. 从“盲人摸象”到“主动探索”:智能搜索的范式转变 如果你用过传统的搜索引擎,无论是百度还是谷歌,你肯定经历过这种挫败感:你输入一个关键词,比如“如何修复MacBook Pro 2015款开机黑屏”,然后得到一长…

2026/10/18 3:24:04 阅读更多 →
AI时代测试工程师转型:从Bug猎人到质量策略专家的能力进化

AI时代测试工程师转型:从Bug猎人到质量策略专家的能力进化

1. 项目概述:当测试遇上AI,一场静默的质变正在发生 如果你是一名测试工程师,最近是不是感觉有点“焦虑”?朋友圈里刷屏的AI编程工具、同事口中讨论的“AI测试平台”、招聘网站上悄然出现的“AI质量策略工程师”岗位……这一切都在…

2026/10/20 12:36:07 阅读更多 →

最新新闻

diagram-design:系统可视化设计的方法论与工程实践

diagram-design:系统可视化设计的方法论与工程实践

1. “diagram-design”不是一张图,而是一套系统性视觉表达方法论很多人第一次看到“diagram-design”这个词,下意识会把它当成“画流程图”“做PPT示意图”或者“用draw.io拖几个框连几条线”的简单操作。我最初也这么想——直到在某高校的跨学科课程设计…

2026/10/20 23:24:57 阅读更多 →
CTF实战套路:从信息收集到Shell提权的骚操作全解析

CTF实战套路:从信息收集到Shell提权的骚操作全解析

CTF里总有那么一类题,你说它难吧,考点可能一点都不深;你说它简单吧,比赛现场就是想不到。这篇文章想聊的,就是这些被老手们称作“骚操作”的常见套路——它们不一定在每场比赛里都会出现,可一旦出现&#x…

2026/10/20 23:24:57 阅读更多 →
《SHIT》期刊收稿全解析:投稿前必须明白的四个选题方向

《SHIT》期刊收稿全解析:投稿前必须明白的四个选题方向

最近收到好几个朋友的私信,都在问同一个事:《SHIT》这本期刊到底收什么稿子,是不是真的什么“垃圾”都收,投了快两个月也没回音,是编辑没看到还是稿子本身出了问题。我干脆把知道的情况和个人投稿经验整理成一篇&#…

2026/10/20 23:24:57 阅读更多 →
从零构建活期储蓄账目管理系统:Flask+SQLite实战指南

从零构建活期储蓄账目管理系统:Flask+SQLite实战指南

1. 从需求出发:为什么我会做这个活期储蓄账目管理系统先说个背景。我一直有记账的习惯,但记账软件换了好几款,总感觉差点意思——要么太重,理财、基金、股票全塞在一个App里,天天给你推送算法推荐;要么太轻…

2026/10/20 23:24:57 阅读更多 →
Flink多流合并算子详解:UNION、CONNECT、CoGroup与JOIN的选型与实战

Flink多流合并算子详解:UNION、CONNECT、CoGroup与JOIN的选型与实战

写了几年Flink作业,发现好多人在多流处理这块还是凭感觉选API。订单流来了,支付流来了,库存流来了,想都没想就union()一把梭,跑出来的数据对不上账,只能半夜爬起来看日志。其实Flink的多流合并算子不是简单…

2026/10/20 23:24:57 阅读更多 →
人机协同学术写作:从白屏恐惧到全流程提效的完整指南

人机协同学术写作:从白屏恐惧到全流程提效的完整指南

最近总有人问我:“你写论文是不是也用AI?”我的回答很统一:用,但不是你们想的那种用法。我不是把题目扔给AI让它替我写,而是把它当成一个特别能加班、特别能抬杠、特别擅长把一句废话扩成三页纸的写作搭子。真正的学术…

2026/10/20 23:23:57 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →