题目:JDK21 中的虚拟线程是怎么回事?
难度:medium
标签:java/thread, general/knowledge, difficulty/medium
评分:⭐⭐⭐☆☆(3/5)
jdk21 的虚拟线程是一种简化线程的资源实现,不像线程是操作系统管控的,虚拟线程是由 jvm 管控的轻量级线程;执行的时候,并不像是线程和操作系统线程一对一,而是大量的虚拟线程对应少量的操作系统线程去执行任务。
优点:
不足:
最后更新:2026-10-26 · 基于第 1 次作答
结论:虚拟线程 = JVM 层 M:N 调度,靠 Continuation(可挂起栈)实现,IO 密集下能开百万级并发。 关键词:Continuation · M:N 调度 · pinning 陷阱 · IO 密集适用 边界:CPU 密集无收益;synchronized 块内阻塞、JNI 会 pin carrier thread
核心考点定位:能否说清虚拟线程的底层机制(Continuation)、M:N 调度模型、适用场景与 pinning 陷阱。
机制链(3 环):
证据锚点(去重 ≥10):
Thread.ofVirtual().start():创建虚拟线程 APIExecutors.newVirtualThreadPerTaskExecutor():每任务一个虚拟线程-Djdk.virtualThreadScheduler.stackSize)-Djdk.tracePinnedThreads=full:排查 pinning 参数jdk.VirtualThreadPinned 事件:监控 pinning对比与权衡:
| 维度 | OS 线程 | 虚拟线程 |
|---|---|---|
| 映射模型 | 1:1 | M:N |
| 栈大小 | 固定 1MB | 可变 32B-1MB |
| 并发量级 | 数万 | 百万级 |
| 调度者 | 操作系统 | JVM ForkJoinPool |
| 创建成本 | 高(系统调用) | 低(用户态) |
| 阻塞代价 | 独占 OS 线程 | 挂起后 carrier 释放 |
| pinning | 无 | 存在(synchronized 阻塞 / JNI) |
| 适用 | CPU 密集 | IO 密集 |
常见误区:
-Djdk.virtualThreadScheduler.stackSize 可限制上限 → 为什么:栈是可变大小但仍有上限适用边界:
-Djdk.tracePinnedThreads=full JVM 参数打印 pin 调用栈;JFR jdk.VirtualThreadPinned 事件;carrier thread 利用率低说明有 pin-Djdk.virtualThreadScheduler.mountPinningPolicy 尝试缓解【结论】 JDK 21 虚拟线程本质是 JVM 层 M:N 调度模型——大量虚拟线程共享少量 OS 线程(carrier threads),靠 Continuation 实现挂起。
【三点】
第一,底层机制:虚拟线程通过 Continuation 实现——可挂起的调用栈。阻塞时把栈帧保存到堆内存,释放 carrier thread 执行其他虚拟线程;唤醒时把栈帧还原到另一个 carrier thread 继续。栈是可变大小(32-512B 起,最大 1MB),所以能开百万级虚拟线程。
第二,关键陷阱是 pinning:虚拟线程在 synchronized 块里阻塞(IO、sleep、join)或调用 native 方法(JNI)时,carrier thread 会被固定在这个虚拟线程上无法卸载,导致 M:N 退化。JDK 21 用 ReentrantLock 缓解——uncontained 时不 pin。排查靠 -Djdk.tracePinnedThreads=full 或 JFR jdk.VirtualThreadPinned 事件。
第三,使用边界:适合 IO 密集(HTTP、DB、RPC),一个请求一个虚拟线程百万并发轻松扛;不适合 CPU 密集(无收益);连接池要跟着调,HikariCP 默认 max=CPU*10 需拉高到几千。API 直接用 Thread.ofVirtual().start() 或 Executors.newVirtualThreadPerTaskExecutor(),Spring Boot 3.2+ 有官方支持。
【边界】 注意两点:一是虚拟线程不是万能的,CPU 密集场景线程池仍是最佳选择;二是生产部署要监控 pinning 事件,避免"看似用了虚拟线程,实际 carrier 被固定"的退化。
| 日期 | 评分 | 备注 |
|---|---|---|
| 2026-10-26 | ⭐⭐⭐☆☆ | 首次作答 |