一个Java虚拟机可以支持多少线程?这因供应商而异吗?按操作系统?其他因素?
当前回答
理论上的绝对最大值通常是进程的用户地址空间除以线程堆栈大小(尽管在现实中,如果所有的内存都留给线程堆栈,那么程序就无法正常工作……)
例如,在32位Windows下,每个进程的用户地址空间为2GB,给每个线程128K的堆栈大小,您期望的绝对最大值为16384个线程(=2*1024*1024 / 128)。在实践中,我发现在XP下我可以启动大约13,000。
然后,我认为你本质上是(a)你是否可以在你的代码中管理这么多线程,而不是做明显的愚蠢的事情(比如让它们都等待同一个对象,然后调用notifyAll()…),以及(b)操作系统是否可以。原则上,如果(a)的答案也是“是”,那么(b)的答案就是“是”。
顺便说一句,你可以在Thread的构造函数中指定堆栈大小;你不需要(可能也不应该)为此而打乱VM参数。
其他回答
在摆弄了Charlie的dielikecode类之后,Java线程堆栈大小似乎是您可以创建的线程数量的很大一部分。
设置java线程堆栈大小
例如
java -Xss100k DieLikeADog
但是,Java有Executor接口。我会使用它,你将能够提交数千个可运行的任务,并让Executor处理这些任务与固定数量的线程。
你可以处理任意数量的线程;没有限制。我在看电影和使用NetBeans时运行了下面的代码,它正常工作/没有停止机器。我认为你可以保留比这个程序更多的线程。
class A extends Thread {
public void run() {
System.out.println("**************started***************");
for(double i = 0.0; i < 500000000000000000.0; i++) {
System.gc();
System.out.println(Thread.currentThread().getName());
}
System.out.println("************************finished********************************");
}
}
public class Manager {
public static void main(String[] args) {
for(double j = 0.0; j < 50000000000.0; j++) {
A a = new A();
a.start();
}
}
}
至少在Mac OS X 10.6 32位上,操作系统有一个限制(2560)。检查这个stackoverflow线程。
2017年…… DieLikeADog类。
新线程#92459 java.lang.OutOfMemoryError:无法创建新的本机线程
i7 - 7700 16 gb的ram
我知道这个问题很老了,但我还是想分享一下我的发现。
我的笔记本电脑能够处理产生25000个线程的程序,所有这些线程以2秒的间隔在MySql数据库中写入一些数据。
我用10,000个线程连续运行这个程序30分钟,然后我的系统也很稳定,我能够做其他正常的操作,如浏览,打开,关闭其他程序等。
当有25,000个线程时,系统速度变慢,但仍保持响应。
当有50,000个线程时,系统立即停止响应,我不得不手动重启系统。
我的系统详细信息如下:
Processor : Intel core 2 duo 2.13 GHz
RAM : 4GB
OS : Windows 7 Home Premium
JDK Version : 1.6
在运行之前,我设置jvm参数-Xmx2048m。
希望能有所帮助。
推荐文章
- 在流中使用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