Java VM可以支持多少个线程

2025/04/02

1. 概述

这些年来,我们使用的系统的性能呈指数级增长。因此,Java VM支持的线程数也增加了。

但是,我们实际上能够创造多少?答案不是一个确切的数字,因为它取决于许多因素

我们将讨论其中的几个因素,以及它们如何影响我们可以在Java VM中创建的线程数。

2. 堆栈内存

线程最重要的组件之一是它的栈,最大堆栈大小和我们创建的线程数与可用的系统内存量直接相关。

因此,增加内存容量也会增加我们可以在系统上运行的最大线程数。有关栈大小的更多详细信息,请参阅我们的文章在JVM中配置栈大小

最后,值得一提的是,从Java 11开始,JVM不会主动为堆栈提交所有保留内存,这有助于增加我们可以运行的线程数。换句话说,即使我们增加最大堆栈大小,线程使用的内存量也将基于实际堆栈大小。

3. 堆内存

堆不直接影响我们可以执行的线程数,但是,它也使用相同的系统内存。

因此,增加堆大小会限制栈的可用内存,从而减少我们可以创建的最大线程数。

4. 操作系统选择

当创建一个新的Java线程时,一个新的本机操作系统线程被创建并直接链接到来自VM的线程。

因此,操作系统控制着线程的管理。

此外,根据操作系统的类型,可能会应用各种限制。

在以下小节中,我们将介绍最常见系统的这些方面。

4.1 Linux

基于Linux的系统在内核级别将线程视为进程,因此,像pid_max内核参数这样的进程限制将直接影响我们可以创建的线程数。

另一个内核参数是threads-max,它描述了线程的总体最大数量。

我们可以通过执行sysctl kernel.<parameter-name>来检索所有这些参数。

最后,每个用户的最大进程数有限制,可使用ulimit -u命令检索。

4.2 Windows

在Windows机器上,没有为线程指定限制。因此,我们可以根据需要创建任意数量的线程,直到我们的系统用完可用的系统内存。

4.3 macOS

运行macOS的系统有2个主要限制,由2个内核参数定义:

  • num_threads表示总体上可以创建的最大线程数
  • num_taskthreads表示每个进程的最大线程数

可以通过执行sysctl kern.<parameter-name>来访问这些参数的值。

值得一提的是,当达到其中一个限制时,将抛出OutOfMemoryError,这可能会产生误导。

5. 虚拟线程

我们可以利用Project Loom附带的轻量级虚拟线程(尚未公开)进一步增加可以创建的线程数量。

虚拟线程由JVM创建,不使用操作系统线程,这意味着我们实际上可以同时创建数百万个虚拟线程。

6. 总结

在本文中,我们研究了可能影响Java虚拟机中可创建的最大线程数的最重要方面。

但是,在大多数情况下,增加限制不太可能永久解决可扩展性问题。我们需要考虑重新考虑应用程序的实现,甚至应用水平扩展。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章