拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Java VM可以支持多少个线程?

Java VM可以支持多少个线程?

白鹭 - 2021-11-24 515 0 0

1.概述

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

但是,我们实际上可以创建多少个?答案不是确切数字,因为它取决于许多因素。

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

2.栈Stack内存

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

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

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

3.堆Heap内存

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

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

4.操作系统选择

创建新的Java线程时,将创建一个新的本机OS线程,并将其直接从VM链接到该本地OS线程。

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

而且,基于操作系统的类型,会有不同的各种限制。

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

4.1 Linux

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

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

**sysctl kernel.<parameter-name>**来检索所有这些参数。

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

4.2Windows

在Windows计算机上,没有为线程指定限制。因此,我们可以创建任意数量的线程,直到系统用尽可用系统内存为止。

4.3苹果系统

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

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

这些参数的值可以通过执行**sysctl kern.** <参数名称>。

值得一提的是,当达到这些限制之一时, OutOfMemoryError ,这可能会产生误导。

5.虚拟线程

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

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

六,结论

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

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *