在 Java 21 中,虚拟线程(Virtual Threads)作为 LTS 特性正式转正(JEP 444)。它承诺以"每个请求一个线程"的编程模型承载百万级并发,同时保持阻塞式代码的可读性。但虚拟线程不是银弹:它改变了线程的调度方式、栈的存储方式,也引入了 pinning 等一系列新问题。这篇文章不讲"虚拟线程让并发变得简单"这类正确的废话,而是深入 JVM 内部,把载体线程调度、栈存储、pinning 的成因与排查、以及真实生产中的调优参数讲透。
一、平台线程与虚拟线程:模型上的本质差异
要理解虚拟线程,必须先明确它与传统平台线程(Platform Thread)的差异。平台线程是操作系统线程(Linux 下的 pthread)的一对一包装,它的调度由内核完成,栈由内核分配,默认约 1MB,创建和切换的开销都相当可观。当你在一个高并发服务里为每个请求开一个平台线程时,瓶颈往往不是 CPU,而是线程数量达到几千后,线程栈的内存占用与内核调度的上下文切换成本。
2024/2/10大约 10 分钟