【问题标题】:What is limiting the number of threads created in a Java application?什么限制了 Java 应用程序中创建的线程数?
【发布时间】:2014-03-30 12:39:22
【问题描述】:

无论分配给应用程序的内存如何,下面的类似乎始终报告 2542 个线程是可能的最大值。 什么限制了这里的线程数?内存、CPU、内部 JVM 设置?

谢谢

public static void main(String... args) {

    int taskNumber = 0;
    while (true) {
        try {
            new MyThread().start();
        } catch (OutOfMemoryError e) {
            System.out.println("Thread " + taskNumber+" could not be created.");
            System.exit(0);
        }
        taskNumber++;
    }
}

【问题讨论】:

  • 很可能你有一个 32 位的 JVM 并且你的虚拟内存用完了。注意:即使您有 64 位 JVM,由于允许的内存映射数量的限制,您可能会发现限制在 32K 左右。无论如何,您可能会发现拥有比 CPU 更多的线程实际上更慢,而不是更快,因此请明智地使用它们。
  • 感谢彼得,关于“线程多于 CPU 更慢”的良好经验法则。在这种特定情况下,这纯粹是一个学术练习!
  • 简而言之,您用完了不太可能是堆的资源。事实上,如果虚拟内存不足,则增加堆可以为线程堆栈等其他事物留出更少的空间。

标签: java multithreading jvm


【解决方案1】:

您的操作系统对其可以处理的线程数有限制。

要获取号码,请在您的机器上执行相应的命令:

Linux:sysctl kernel.threads-max

Mac OSX:sysctl kern.num_threads

补充:也许你可以在这个帖子中找到一些有趣的答案:How many threads can a Java VM support?

【讨论】:

  • @bluebrain 不,Java 使用本机操作系统线程机制;至少所有现代 JVM 都可以(在 Linux 下,将使用 clone(2))
  • 你成功了,在 OSX 10.6 JDK6 和 8 上测试了 32 位和 64 JVM。在我的机器上,根据 sysctl,限制是 2560,所以这就是我的限制的来源。操作系统。
【解决方案2】:

对于本机线程,限制在于 JVM 进程的底层操作系统资源分配。

对于绿色线程,限制在 JVM 实现中,但它在单个本机线程上运行。

【讨论】:

  • 有趣,谢谢,我忽略了绿色线程的存在。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 2018-06-29
相关资源
最近更新 更多