当前位置:首页 > 文章列表 > 文章 > java教程 > JDK 24/25 虚拟线程 pinning 排查:synchronized 还会把吞吐卡住吗

JDK 24/25 虚拟线程 pinning 排查:synchronized 还会把吞吐卡住吗

来源:OpenJDK JEP 491 fact check 2026-06-05 10:22:01 0浏览 收藏

这篇写一个最近 Java 团队升级 JDK 时经常会问的问题:虚拟线程上线后,JDK 21/23 里 synchronized 导致的 pinning,到 JDK 24/25 还要不要管?我的答案是:版本改善是真的,但生产排查不能靠一句“已经修了”。

适用范围:Java 21 到 25、Spring Boot 3.x 虚拟线程、JFR、ThreadPoolTaskExecutor 迁移、同步代码改造。OpenJDK/JEP/JFR 资料只用来核对事实,正文按一次后端服务升级复盘来写。

Java 虚拟线程 pinning 排查思维导图
脑图:先把现象、版本、触发点、诊断、修复和上线验证串起来。

业务场景:订单详情接口开了虚拟线程,p99 还是抖

我们有个订单详情接口,Spring Boot 3.x 开了虚拟线程后,平均响应时间好看了不少,但高峰 p99 仍然偶发抖动。线程 dump 看不到传统线程池排队,数据库连接池也没满,第一眼很容易误判成“下游偶发慢”。

后来抓 JFR 才发现,少量请求会进入一个带 synchronized 的收据组装方法,方法里还夹着远程价格查询。Java 21/23 上这类写法可能把虚拟线程 pin 在 carrier 上,carrier 一忙,虚拟线程再便宜也救不了尾延迟。

先说版本差异:JDK 24+ 不是免死金牌

Java 24 开始,常见 synchronized 场景导致虚拟线程 pinning 的问题有明显改善,这对保留老代码迁移虚拟线程非常有价值。但我不会因此把所有锁审查删掉,因为 native 调用、长时间持锁、锁里做阻塞 I/O 这些生产坏味道仍然会伤害吞吐和可维护性。

我的升级建议是:Java 21/23 环境先把锁里阻塞 I/O 当成高风险处理;Java 24/25 环境也要用 JFR 证明 pinned 事件和 p99 已经受控。版本帮你减少坑,不会替你完成架构 review。

问题复现:一个看起来无害的 synchronized 方法

最容易出事故的代码不是大锁套大锁,而是“为了保护一点缓存状态”,顺手把数据库查询、HTTP 调用、JSON 组装都包进了同步方法。低并发没事,一到高峰就变成 carrier 被拖住。

Java 虚拟线程 synchronized pinning 代码案例
案例:把阻塞 I/O 移出 synchronized 热区,锁只保护共享状态。

诊断步骤:别靠猜,用 JFR 把栈抓出来

我一般先在灰度实例开一段短 JFR,重点看 jdk.VirtualThreadPinned、线程状态、HTTP/JDBC 等待时间和接口 p99。抓到事件以后不要只看数量,要按调用栈归类:是业务锁、框架锁、native 调用,还是某个 SDK 在锁里做了阻塞。

如果 pinned duration 很短,但 p99 仍然高,就别继续盯着 pinning 了,去看连接池等待、下游限流、GC 暂停和 CPU 热点。排障最怕抓到一个“看起来像原因”的信号就停。

Java 虚拟线程 pinning JFR 排查流程
流程:复现、抓 JFR、归类栈、改代码、灰度验证,缺一环都容易误判。

上线检查:我会盯这 7 个点

  • 确认运行时版本:Java 21/23 与 Java 24/25 的压测结果分开记录。
  • JFR 是否开启过 VirtualThreadPinned 观察,是否保存样本。
  • 锁内是否还存在 JDBC、HTTP、文件 I/O 或慢序列化。
  • 连接池、Bulkhead、Semaphore 是否限制的是下游资源,而不是虚拟线程数量。
  • p95/p99、错误率、超时率是否和老版本同流量对比。
  • 是否有快速关闭虚拟线程或回退 JDK 的配置路径。
  • ThreadLocal 大对象和 MDC 清理是否通过压测和日志验证。

我的经验

虚拟线程真正改变的是“等待线程”的成本,不是让阻塞资源无限变多。JDK 24/25 让 synchronized 的迁移体验更好,但生产系统里最贵的往往不是线程,而是数据库连接、下游 QPS、锁粒度和排障时间。

所以我会把这类升级拆成三步:先用 JFR 找证据,再把锁内阻塞点移出去,最后用灰度数据决定是否扩大流量。这样文章里的结论不是版本宣传,而是能在凌晨事故里救人的操作手册。

版本声明
本文转载于:OpenJDK JEP 491 fact check 如有侵犯,请联系study_golang@163.com删除
Java 线程池队列堆积复盘:别让无界队列把慢故障藏起来Java 线程池队列堆积复盘:别让无界队列把慢故障藏起来
上一篇
Java 线程池队列堆积复盘:别让无界队列把慢故障藏起来
MySQL 8.4 连接池雪崩实战:Too many connections 不是把 max_connections 调大就完事
下一篇
MySQL 8.4 连接池雪崩实战:Too many connections 不是把 max_connections 调大就完事
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    6144次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    6553次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    6366次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    8328次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    6968次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码