一个Java虚拟机可以支持多少线程?这因供应商而异吗?按操作系统?其他因素?
当前回答
最大线程数取决于以下因素: 硬件配置,如微处理器,RAM。 操作系统是32位还是64位 run方法内部的代码。如果run方法内的代码很大,那么单个线程对象将有更多的内存需求
其他回答
我记得我听过一个关于Clojure的演讲,他在一个贸易展览会上在一些有数千个(9000个?)核的专业机器上运行他的一个应用程序,然后它把它们都加载了。不幸的是,我现在找不到链接(帮助?)
基于此,我认为可以肯定地说,硬件和代码是限制因素,而不是JVM。
在阅读了Charlie Martin的文章后,我很好奇堆大小是否会对您可以创建的线程数量产生影响,结果完全让我目瞪口呆。
使用Vista Home Premium SP1上的JDK 1.6.0_11,我执行Charlie的测试应用程序,使用不同的堆大小,在2mb到1024mb之间。
例如,要创建一个2 MB的堆,我将使用参数-Xms2m -Xmx2m调用JVM。
以下是我的结果:
2 mb --> 5744 threads
4 mb --> 5743 threads
8 mb --> 5735 threads
12 mb --> 5724 threads
16 mb --> 5712 threads
24 mb --> 5687 threads
32 mb --> 5662 threads
48 mb --> 5610 threads
64 mb --> 5561 threads
96 mb --> 5457 threads
128 mb --> 5357 threads
192 mb --> 5190 threads
256 mb --> 5014 threads
384 mb --> 4606 threads
512 mb --> 4202 threads
768 mb --> 3388 threads
1024 mb --> 2583 threads
堆大小肯定很重要。但是堆大小和最大线程数之间的关系是反比的。
这很奇怪。
2017年…… DieLikeADog类。
新线程#92459 java.lang.OutOfMemoryError:无法创建新的本机线程
i7 - 7700 16 gb的ram
现代(systemd) linux系统的附加信息。
有很多关于这个值的资源可能需要调整(例如如何增加JVM线程的最大数量(Linux 64bit));然而,一个新的限制是通过systemd“TasksMax”限制来设置pid。Max在cgroup上。
对于登录会话,UserTasksMax默认值是内核限制pids_max的33%(通常是12,288),可以在/etc/systemd/logind.conf中重写。
对于服务,DefaultTasksMax默认值是内核限制pids_max的15%(通常是4,915)。您可以通过在“systemctl edit”中设置TasksMax或在/etc/systemd/system.conf中更新DefaultTasksMax来覆盖该服务
当我在我的2GB三星AMD处理器笔记本电脑上运行Trisquel linux (Ubuntu 18.04)研究这个主题时。它可以管理9534个线程,然后抛出特殊的异常
在java.base / java.lang.Thread。start0(本地方法) 在java.base / java.lang.Thread.start (Thread.java: 803) 在Main.main (Main.java: 11)
代码:
public class MultithreadingRunnable implements Runnable {
public void run() {
System.out.println("ThreadID " + Thread.currentThread().getId());
}
}
public class Main {
public static void main(String[] ars) {
for(int i = 0;i<10000;i++){
Thread mr = new Thread(new MultithreadingRunnable());
mr.start();
}
}
}
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 自动化invokerrequired代码模式
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder