【发布时间】: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