Java 虚拟线程遇到阻塞调用时的线程占用分析
Java 虚拟线程遇到阻塞调用,不一定持续占用一个平台线程。分析时要分开看虚拟线程是否能够从载体卸载、是否存在固定载体的调用,以及线程等待的数据库连接等资源是否已经耗尽。虚拟线程数量增多,本身不能证明平台线程泄漏,也不能证明吞吐量必然提高。
本文以 JDK 26 文档为主要口径。Java 官方文档入口:https://docs.oracle.com/en/java/javase/26/。下面给出指标记录方法,不报告未执行过的压测成绩。
先记录三个基线,不只看线程总数
面对“并发一高就慢”,先记录固定时间窗口内的完成请求数、延迟分位数与错误率,再记录进程的平台线程、CPU、内存及资源池占用。把请求等待拆成入口排队、资源获取和下游调用,才能知道线程调度是否真是限制。
| 观察项 | 说明什么 | 不能单独证明什么 |
|---|---|---|
| 虚拟线程及任务积压 | 正在承载或等待的工作规模 | 不能等同于操作系统线程数 |
| 载体和平台线程 | 实际线程资源与执行承载 | 不能单凭数量归因于固定载体 |
| 连接池获取耗时 | 业务资源竞争 | 不能等同于调度器繁忙 |
| 下游响应与超时 | 依赖服务的实际限制 | 不能用更换线程模型消除 |
基线应带上 JDK 完整版本、处理器配额、堆配置、驱动版本、连接池容量和请求输入。本文没有可报告的基线数值;这些是读者需要在自己环境填写的记录项。
区分阻塞等待与固定载体
JDK 26 文档说明,虚拟线程由运行时安排在载体平台线程上执行,常见阻塞 I/O 可使其卸载,让载体承载其他虚拟线程;文档同时列出 native 方法或 foreign function 场景下的固定限制。不能由“代码使用同步调用风格”直接推出“载体全程被占用”。JDK 26 虚拟线程文档
也要区分版本:JDK 24 已通过相关变更改善 synchronized 构造中的阻塞卸载行为。因此,针对早期 JDK 的“把所有 synchronized 都换掉”不能直接当作 JDK 26 的处理方案。锁竞争导致业务串行,和固定载体,是不同问题。JDK 24 重要变更

在真实问题中,可结合线程转储和 JFR 观察具体等待栈、相关事件及持续时间。工具可见范围和事件阈值要按当前 JDK 文档理解,不能仅因未出现某个事件就证明不存在所有类型的线程占用。
连接池满了,轻量等待仍然是等待
假设数据库连接池只有有限连接,虚拟线程可以让更多请求等待获取连接,但不会为数据库增加处理能力。任务即便不长期占用载体,也会持有请求上下文、超时预算和其他内存。无界提交可能把平台线程瓶颈改成更大的等待队列。
因此资源池应单独记录活跃连接、等待数量、获取耗时和获取超时。资源限额应围绕真实下游容量定义;不能因为线程更轻就随意扩大连接池,更不能把虚拟线程池当成数据库容量控制器。

一次只改变一个因素,按同口径比较
建议先固定相同输入、相同到达负载、相同预热与统计窗口,比较原有执行方式和虚拟线程方式;保持连接池、下游限制及超时策略不变。不要同时升级驱动、扩大连接池又改变任务模型,再把全部变化归因于虚拟线程。
第二组实验才调整资源并发限制,继续记录完成吞吐、p95/p99、超时率、连接池等待和内存。压测端若只能等待上一请求完成后发送下一请求,也要记录这一限制,避免把客户端供给不足误当服务端已经达到容量上限。
| 观察到的对比 | 优先解释方向 |
|---|---|
| 平台线程压力下降,连接等待仍高 | 线程承载得到改善,业务资源仍受限 |
| 任务积压和内存持续上涨 | 检查入口负载与有界并发策略 |
| CPU接近配额且完成量不变 | 检查CPU工作量,不预设I/O调度可解决 |
| 少数长调用伴随载体占用 | 检查具体阻塞实现与相关观测证据 |
这些是判读方向,不是本文测试结果。可靠结论应同时描述负载、资源配置、错误率和延迟,而不只说“线程数少了”。
虚拟线程解决承载方式,不取消容量边界
适合优先评估的是大量等待型任务;长时间 CPU 密集工作不会因为换成虚拟线程而自动加速。保留依赖超时、有界入口及资源释放规则,确认取消是否真正传播到驱动或下游,不能把请求超时等同于资源已经释放。
线程处于等待状态就一定不占载体吗?
不能仅凭状态名推断。需要结合实际调用、JDK版本和运行时证据区分卸载、固定及其他阻塞实现。
连接池等待多,需要增加调度器线程吗?
不应直接这样处理。先确认连接与下游容量限制,否则增加调度承载并不能创造更多可用连接。
虚拟线程很多是否就是异常?
不一定。应结合任务生命周期、积压是否有界、内存和完成请求数判断,而不是使用平台线程时代的数量直觉。
PHP-FPM pool 进程数与慢请求的配置思路
- 上一篇
- PHP-FPM pool 进程数与慢请求的配置思路
- 下一篇
- Java MethodHandle invokeExact 类型不匹配为什么会失败
-
- 文章 · java教程 | 1小时前 | Java · Java教程 · java classpath module-info.java module-path 模块可见性
- Java 模块路径和类路径冲突的定位清单
- 210浏览 收藏
-
- 文章 · java教程 | 1小时前 | JSON · Java · 序列化 · 类型系统 · java 反序列化 jackson sealed interface 多态JSON JsonTypeInfo
- Java 多态 JSON 映射的类型边界
- 478浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java Stream 分组后保持排序的收集方案
- 104浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java HttpClient ofFileDownload 怎样保存响应文件名
- 365浏览 收藏
-
- 文章 · java教程 | 1小时前 | 超时 · Java ·
- Java HttpClient 分层超时的配置方法
- 344浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java MethodHandle invokeExact 类型不匹配为什么会失败
- 494浏览 收藏
-
- 文章 · java教程 | 2天前 | 线程池 · Java教程 · java 并发编程 ForkJoinPool ForkJoinTask managedBlock ManagedBlocker
- Java ForkJoinPool managedBlock 怎样避免阻塞任务拖住并行计算
- 489浏览 收藏
-
- 文章 · java教程 | 2天前 |
- Java DatagramChannel 怎样设置非阻塞接收
- 337浏览 收藏
-
- 文章 · java教程 | 2天前 |
- Java WebSocket.Listener 怎样控制下一条消息的接收节奏
- 370浏览 收藏
-
- 文章 · java教程 | 2天前 |
- Java Flow Publisher 怎样实现背压协议
- 339浏览 收藏
-
- 文章 · java教程 | 2天前 |
- Java CompletableFuture resultNow 怎样读取已完成结果
- 302浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 504次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 562次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 589次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 540次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 352次使用
-
- Java try-with-resources 多个资源关闭顺序是什么
- 2026-09-10 501浏览
-
- 矩阵主副对角线快速定位技巧
- 2026-05-31 501浏览
-
- Java多态优化流程代码与行为分发改进
- 2026-05-26 501浏览
-
- JVM 类元数据双亲委派链表深度解析
- 2026-05-21 501浏览
-
- 反射异常处理:InvocationTargetException解析与应用
- 2026-05-16 501浏览
