跳转至

JVM 最多支持多少个线程?是否和虚拟机厂商有关?

结论

JVM 没有硬性的线程上限,实际能创建多少线程受以下因素限制:

  1. 操作系统层面:进程最大线程数、虚拟内存、栈大小。
  2. JVM 层面:每个线程要分配栈空间。
  3. CPU/内存:线程多了调度和内存开销大。

不同 JVM 厂商(HotSpot、OpenJ9、Zing)的实现略有差异,但底层都受 OS 约束。

决定因素

1. 每个线程的栈大小

JVM 启动参数:

-Xss512k    # 每个线程栈大小,默认 512k~1m(不同 OS/JDK 不同)

栈空间在 Java 堆之外,从进程虚拟内存分配。如果 32 位进程虚拟地址空间只有 2~4GB,那么:

最大线程数 ≈ (进程可用虚拟内存 - 堆 - 元空间) / Xss

例如:堆 1G,栈 1M,32 位进程理论上最多约 2000 个线程。

2. 操作系统限制

  • Linux:/proc/sys/kernel/threads-maxulimit -u(用户进程数)。
  • Windows:每个线程默认保留 1MB 地址空间(即使只用到几 KB)。
  • macOS:kern.num_taskthreads 等参数。

3. JVM 厂商差异

JVM 特点
HotSpot 标准实现,线程数受上述限制
OpenJ9 内存占用小,同等硬件能开更多线程
Azul Zing 商业 JVM,针对大堆、多线程优化
GraalVM Native Image 编译成原生二进制,线程模型接近原生

实测参考

普通 4G 内存 Linux 机器,堆 1G,通常能开 几千个线程。再往上会抛:

java.lang.OutOfMemoryError: unable to create new native thread

优化思路

  • 减小 -Xss(如 256k),但过小会 StackOverflowError。
  • 不要无脑 new Thread(),用线程池。
  • 高并发场景用 NIO + 少量工作线程,或 Java 21 虚拟线程(单 JVM 可开百万级)。

面试加分

  • OOM 类型:unable to create new native thread 不是堆爆了,而是 OS 层面无法再创建线程。
  • 线程池最大线程数不是越大越好,IO 密集型可以多些,CPU 密集型 = CPU 核数 + 1。