1. 概述

这些年,我们所使用的系统性能呈指数级增长,因此 Java 虚拟机(JVM)所能支持的线程数量也随之大幅提升。

那么问题来了:到底一个 JVM 最多能创建多少个线程?

✅ 答案并不是一个固定值,它受到多个因素的影响。

接下来我们会讨论其中几个关键因素,并分析它们是如何影响 JVM 中线程数量上限的。

2. 栈内存(Stack Memory)

线程的核心组件之一就是它的栈。线程栈的大小和我们能创建的线程数,与系统可用内存密切相关。

所以,增加内存容量,就能提升系统能运行的最大线程数。

⚠️ 注意:从 Java 11 开始,JVM 不再为线程栈预分配所有保留内存,而是按需使用,这有助于我们创建更多线程。换句话说,即使你设置了很大的栈大小(-Xss),实际使用的内存也只取决于线程真正使用的栈深度。

📌 更多关于 JVM 栈大小配置的内容,可以参考我们的文章:Configuring Stack Sizes in the JVM

3. 堆内存(Heap Memory)

堆内存本身并不会直接影响线程数量,但它也占用系统内存。

⚠️ 所以如果你把堆内存设置得过大,留给线程栈的内存就会变少,从而限制了你能创建的线程总数。

✅ 总结一句话:堆和栈共用物理内存,此消彼长。

4. 操作系统选择

在 JVM 中创建一个 Java 线程时,会对应创建一个本地操作系统线程(native thread),并与其绑定。

因此,线程的最终管理权在操作系统手中

不同操作系统对线程数量的限制也不同,下面我们来看几个主流系统的表现。

4.1. Linux

在 Linux 系统中,内核层面把线程当作进程来处理。所以一些进程相关的限制也会限制线程数,比如:

  • pid_max:系统中最大进程/线程 ID 数量
  • threads-max:整个系统能创建的最大线程数

你可以通过以下命令查看这些参数:

sysctl kernel.pid_max
sysctl kernel.threads-max

另外,还有一个用户级别的限制:

ulimit -u

它控制的是单个用户最多能创建的进程/线程数

4.2. Windows

Windows 平台没有硬性限制线程数量,只要你内存足够,想创建多少线程都可以。

⚠️ 但实际中,内存耗尽时会抛出 OutOfMemoryError,这是最常见的限制因素。

4.3. macOS

macOS 有两个关键内核参数控制线程数量:

  • kern.num_threads:整个系统能创建的最大线程数
  • kern.num_taskthreads:单个进程能创建的最大线程数

你可以通过以下命令查看:

sysctl kern.num_threads
sysctl kern.num_taskthreads

⚠️ 注意:当这些限制达到时,JVM 会抛出 OutOfMemoryError,容易让人误以为是堆内存问题。

5. 虚拟线程(Virtual Threads)

如果你使用的是 Project Loom 提供的虚拟线程(目前尚未正式发布),那么线程数量可以轻松达到百万级。

✅ 虚拟线程由 JVM 管理,并不直接映射到操作系统线程,因此资源占用极小。

简单粗暴地说:虚拟线程 = 轻量级线程 = 几乎无限创建

6. 总结

在这篇文章中,我们分析了影响 JVM 最大线程数的几个关键因素:

  • 栈内存大小
  • 堆内存占用
  • 操作系统限制
  • 是否使用虚拟线程

⚠️ 但需要提醒的是,一味地提高线程数量并不能从根本上解决系统扩展性问题。

✅ 更好的做法可能是:

  • 优化应用架构(如使用异步、响应式)
  • 引入水平扩展(集群、负载均衡)
  • 使用更高效的线程模型(如虚拟线程)

毕竟,线程不是越多越好,关键是用得聪明。


原始标题:How Many Threads Can a Java VM Support?