JVM 中的最大线程数?

新手上路,请多包涵

Java虚拟机最多可以维护多少个线程?

我没有在我原来的问题中解释这一点,但我正在尝试对 JVM 进行基准测试,并想看看它可以同时维护多少线程。

在一个循环中创建线程直到抛出异常是一种选择,但是,我想知道是否有更好的方法来做到这一点。

原文由 Craig Locke 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 542
2 个回答

编写一个创建新线程直到它崩溃的循环是找出问题的最终方法。您可能会看到性能在它真正消失之前就已经严重下降。

我不知道 JVM 中是否有任何配置参数或其他内置限制。我在实践中从未遇到过限制。当然迟早你会耗尽内存,也许是其他资源。

我怀疑线程数量本身没有限制,而是与线程关联的资源有限制。也就是说,如果所有线程都只运行一个小类,每个线程只有几个字节的数据,您可能会看到您可以拥有 10,000 个线程,但是当它们每个都有 1000 万个字符串的数组时,这个数字会迅速下降。

原文由 Jay 发布,翻译遵循 CC BY-SA 3.0 许可协议

您的操作系统和硬件配置会有一些限制。

要增加并发线程数,您应该降低默认堆栈大小 java -Xss 64k

  • Oracle 32 位 JVM 默认为每个线程 320kb 堆栈大小。
    • 对于具有 2gb 可寻址内存的 32 位 JVM,这将为您提供最多 6.5k 个线程。
  • Oracle 64 位 JVM 默认为每个线程 1M 堆栈大小。
    • 对于每 GB 的内存,您将使用默认值获得 1024 个线程。
  • 仅适用于 Linux:
    • ulimit -a 将为您提供针对用户进程和内存的配置限制
    • 在 linux 中,您只会获得 32k 个唯一的 PID cat /proc/sys/kernel/pid_max 最多 32k 个进程。
    • 你只会得到 255k 线程 cat /proc/sys/kernel/threads-max

原文由 flob 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题