什么是限制Java应用程序中创建的线程数?
下面的类似乎始终报告2542个线程为最大可能线程,而与分配给应用程序的内存无关。 这里限制线程的数量是什么?内存、CPU、内部JVM设置 谢谢什么是限制Java应用程序中创建的线程数?,java,multithreading,jvm,Java,Multithreading,Jvm,下面的类似乎始终报告2542个线程为最大可能线程,而与分配给应用程序的内存无关。 这里限制线程的数量是什么?内存、CPU、内部JVM设置 谢谢 public static void main(String... args) { int taskNumber = 0; while (true) { try { new MyThread().start(); } catch (OutOfMemoryError e) {
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++;
}
}
对于本机线程,限制在JVM进程的底层操作系统资源分配中
对于绿色线程,限制在JVM实现中,但它在单个本机线程上运行。操作系统对它可以处理的线程数量有限制 要获取号码,请在计算机上执行相应的命令: Linux:
sysctl内核.threads max
Mac OSX:sysctl kern.num\u threads
添加:也许你可以在这个线程中找到一些有趣的答案:@bluebrain不,Java使用本机OS线程机制;至少所有现代JVM(在Linux下,将使用
clone(2)
)都做到了,您已经完成了测试,在OSX 10.6 JDK6和8上测试了32位和64个JVM。在我的框中,根据sysctl,限制是2560,所以这就是我的限制的来源。最有可能的情况是,您有一个32位JVM,并且您的虚拟内存不足。注意:即使您有一个64位JVM,您可能会发现由于允许的内存映射数量的限制,限制在32K左右。在任何情况下,你可能会发现拥有比CPU更多的线程实际上是较慢的,而不是较快的,所以要明智地使用它们。在这种情况下,这纯粹是一个学术练习!简而言之,您正在耗尽不太可能成为堆的资源。事实上,如果虚拟内存不足,增加堆可以为其他事情(如线程堆栈)留下更少的空间。有趣的是,谢谢,我忽略了绿色线程的存在。