Spring Boot 启动或请求卡顿:从 Bean 锁、事件广播到连接池

发布时间:2026/10/6 9:33:40

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 或显式调整调用边界并写测试确认事务与异步行为。
延伸阅读

更多相关文章

2026/10/6 9:37:07

从OpenClaw到OPC智能体:AI Agent创业热潮下的技术本质与务实路径

1. 从“龙虾十条”到智能体创业:一个被误解的隐喻 最近在技术圈和创业圈里,一个叫“OpenClaw”的词突然火了起来,连带“OPC智能体创业”也成了不少人讨论的话题。如果你去搜,会发现很多人在问“OpenClaw怎么安装”、“OPC UA怎么连…

2026/10/6 9:37:57

qemu-system-x86_64 -m 4096M

通过 qemu-system-x86_64 -m 4096M 指定的内存大小,最终会进入客户机内核的 e820_table 中。这是因为 QEMU 在模拟固件时,会主动创建一张 E820 内存映射表,并将你指定的内存作为一个 E820_RAM 类型的条目添加到这张表中。QEMU如何生成包含内存…

2026/10/6 14:14:15

功放音箱线连接全攻略:从阻抗、极性到接头选型的底层逻辑

1. 连接前必须搞懂的几件事:线材、阻抗与信号的底层逻辑玩功放这件事,很多人一开始就纠结“换什么线”“买什么头”,结果喇叭端子松了、正负极反了,还在那儿怀疑功放推力不行,最后把好端端一套系统玩成玄学。我做这行十…

2026/10/6 14:14:15

LeetCode 208:手写Trie前缀树,搞定搜索联想与自动补全核心逻辑

面试场上被问到“你项目里的搜索联想是怎么做的”,很多人的第一反应是拉倒排索引。其实在数据规模不大、只想快速支持前缀匹配的场景里,一棵前缀树Trie往往更直接。LeetCode 208这道题——实现Trie(前缀树),常年霸占热…

2026/10/6 14:14:15

Spring Boot高校心理咨询管理系统设计与实现全解析

高校大学生心理咨询管理系统这种题目,在Java Spring Boot的课设和毕设里属于热度很高的类型。它不像电商、博客那些项目那么烂大街,业务逻辑又足够完整:有角色、有预约、有测评、有档案,前后端能串成一条清晰的主线。拿来做毕设、…

2026/10/6 14:14:15

Trie树核心原理与实现:从LeetCode 208到前缀匹配应用

1. 项目概述与思路拆解1.1 一个看起来简单却暗藏玄机的题目你有没有想过,为什么搜索引擎输入几个字符就能立刻给出完整的建议词?手机通讯录里输入“zhang”就能把所有姓张的联系人拉出来?这些体验背后都站着一个经典的数据结构——Trie树&…

2026/10/6 14:14:15

高校心理咨询管理系统设计与Spring Boot实现:从预约到测评全解析

如果你正在准备Java方向的毕业设计,大概率会碰到这类题目:高校大学生心理咨询管理系统。我第一次拿到这套题目时,觉得“又是一个CRUD项目”,但真正把基于Spring Boot的源码完整跑通、拆完模块之后,我发现它比想象中更值…

2026/10/6 14:09:15

Claude Code营销技能模块化:SEO、CRO与Analytics自动化实战

1. 从“marketingskills”说起:一个被低估的增长工具箱 第一次看到“marketingskills”这个词,很多人会以为它只是一个营销技巧的合集,或者某个培训课程的代号。但如果你最近在关注 Claude Code、AI agents 以及自动化工作流这些方向&#xf…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

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

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑