堆空间/非堆空间内存对 JVM 进程的可能线程数的影响

Impact of heap space / non heap space memory on number of possible threads for a jvm process

提问人:Gestalt 提问时间:10/1/2023 更新时间:10/1/2023 访问量:97

问:

根据一些博客文章和stackoverflow问题,我得出了以下结论:

  • Java 应用程序中可能的最大线程数取决于操作系统限制,而不是堆栈大小 (xss)。
  • 此外,根据这个 SO 问题的许多答案,最大可能的线程可能取决于许多因素-
    • 操作系统和 CPU 架构
    • 堆大小

我没有考虑堆大小对我的应用程序可以创建的线程数的影响,就像 SO 问题中的答案所建议的那样。

有没有一个简单的 jvm 属性允许我配置可用于创建新线程的最大内存?我认为我无法证明增加 -Xmx 或任何其他未明确用于线程创建的内存部分以增加我的应用程序中的线程数量是合理的,但我似乎找不到这样的 jvm 属性。

有问题的 JVM 是 openjdk 8 (hotspot) 1.8。

多线程 java-8 jvm-hotspot

评论

0赞 Tim Moore 10/1/2023
线程堆栈大小不是您想要的吗?
0赞 Gestalt 10/1/2023
据我了解,java 中的线程堆栈大小决定了每个线程的堆栈可以有多少帧/我可以深入递归调用。我要配置的是我的应用程序可以创建的线程数,而不管它们的堆栈大小如何。根据我的第一个来源,这似乎与堆栈大小无关。
2赞 Mark Rotteveel 10/1/2023
你的第一点是错误的,最大值取决于操作系统限制堆栈大小(或者换句话说,要么你达到了线程的操作系统限制,要么你耗尽了内存)。无论如何,据我所知,Java 没有限制这一点的选项。老实说,我不确定你在做什么,你需要担心这一点。
2赞 Holger 10/4/2023
@MarkRotteveel默认情况下,堆栈内存已分配,但未提交。因此,如果您只创建线程而不运行它们,或者线程执行的代码不使用堆栈,则堆栈大小确实不会影响您可以创建的线程数。当然,它对 32 位系统产生了影响,在 32 位系统中,即使是虚拟内存(地址空间)也很稀缺。

答:

0赞 Yahor Barkouski 10/1/2023 #1

在 OpenJDK 8 中,没有直接的 JVM 属性来专门为线程创建配置最大内存。用于线程堆栈的内存是进程本机内存的一部分,进程可以使用的总本机内存由操作系统管理。

所以你对参数的看法是正确的——它控制着最大堆大小,但不影响可用于线程创建的本机内存。需要注意的是,如果您的应用程序使用较少的堆内存,则假设系统的总内存是固定的,则可能会有更多的本机内存可用于线程创建 - 也许您可以尝试这样做。-Xmx

所以是的,这里没有一个直接的 JVM 属性来专门控制用于线程创建的总内存。

评论

1赞 Tim Moore 10/1/2023
另一方面,大多数线程将分配内存来执行它们执行的任何特定于应用程序的工作。因此,堆大小也以这种方式限制了线程的数量:运行的并发线程越多,它们消耗的堆就越多。在变得有害之前,您可以并发运行的线程数的实际限制取决于许多交互因素。
0赞 Gestalt 10/8/2023
感谢您抽出宝贵时间。Hotspot 1.8 以外的某些 JDK 实现是否存在此类属性?