Linux中一个Java虚拟机可以支持多少线程?
我编写了线程池类 环境:Windows7 4 cp 在Windows7中用70000个线程执行了我的程序,在JDK1.5下它成功通过了。未使用vm参数 我在Linux enterprise edition中尝试使用5000线程执行相同的代码,该版本位于具有4GB基本内存的虚拟机下。使用vm参数-xms512m-xmx1024m。它执行到2156个线程并抛出异常 线程“main”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程 位于java.lang.Thread.start0(本机方法) 在java.lang.Thread.start(Thread.java:597)处 在testthreadpool.ThreadPool.(ThreadPool.java:38) 位于testthreadpool.testthreadpool.main(testthreadpool.java:16) 但同样的代码在windows7中运行得很好 我可以知道为什么会发生这个错误吗。这个java代码需要1GB内存才能运行5000个线程吗 我的实际需求是拥有10000个工作线程的线程池 我的实际要求是持有 具有10000个工作线程的线程池 我想你需要重新考虑一下你的要求。这绝不是一个好主意,对性能来说是灾难性的 我的实际要求是持有 具有10000个工作线程的线程池Linux中一个Java虚拟机可以支持多少线程?,java,linux,multithreading,threadpool,redhat,Java,Linux,Multithreading,Threadpool,Redhat,我编写了线程池类 环境:Windows7 4 cp 在Windows7中用70000个线程执行了我的程序,在JDK1.5下它成功通过了。未使用vm参数 我在Linux enterprise edition中尝试使用5000线程执行相同的代码,该版本位于具有4GB基本内存的虚拟机下。使用vm参数-xms512m-xmx1024m。它执行到2156个线程并抛出异常 线程“main”java.lang.OutOfMemoryError中出现异常:无法创建新的本机线程 位于java.lang.Threa
我想你需要重新考虑一下你的要求。这绝不是一个好主意,对性能来说是灾难性的。正如@Yann所指出的,使用10000个线程是一个非常糟糕的主意。。。除非你有一台有数千个内核的机器。您应该认真研究应用程序设计 短期内,尝试使用
-Xss…
JVM参数调整默认线程堆栈大小。还要注意的是,堆栈没有在堆内存中分配,因此您的-Xms512m-Xmx1024m
选项没有为堆栈保留空间。相反,它保留了不能用于堆栈的空间
最后,可能还有其他因素(线程堆栈的内存除外)会限制应用程序可以创建的线程数量。正如@Yann所指出的,使用10000个线程是一个非常糟糕的主意。。。除非你有一台有数千个内核的机器。您应该认真研究应用程序设计 短期内,尝试使用
-Xss…
JVM参数调整默认线程堆栈大小。还要注意的是,堆栈没有在堆内存中分配,因此您的-Xms512m-Xmx1024m
选项没有为堆栈保留空间。相反,它保留了不能用于堆栈的空间
最后,可能还有其他因素(线程堆栈的内存除外)会限制应用程序可以创建的线程数。线程需要一个堆栈,该堆栈必须具有初始大小。对于线程,初始堆栈大小默认为堆栈大小资源限制,如
ulimit-s
所示,但可以通过调用pthread\u attr\u setstacksize()
进行更改。(请参见另一个)。线程需要堆栈,堆栈必须具有初始大小。对于线程,初始堆栈大小默认为堆栈大小资源限制,如ulimit-s
所示,但可以通过调用pthread\u attr\u setstacksize()
进行更改。(另见此)。您使用的是64位吗
不要期望32位机器能够运行大量线程。您可能还希望调整堆栈大小。启动大量线程会对堆栈使用大量内存,除非您能够容忍较小的堆栈,否则无法绕过这一点
在x86_64上检查,Linux似乎默认为8M堆栈,这意味着1k线程需要8G堆栈,所以您确实要小心这一点。您使用64位吗
不要期望32位机器能够运行大量线程。您可能还希望调整堆栈大小。启动大量线程会对堆栈使用大量内存,除非您能够容忍较小的堆栈,否则无法绕过这一点
在x86_64上检查,Linux似乎默认为8M堆栈,这意味着1k线程需要8G堆栈,因此您确实需要小心。限制是不使用并发包。只需要使用佩林Java线程。可能是个坏主意。但当我提供足够的内存空间时,对创建线程的数量并将其保持在可运行模式没有限制。它在2156左右失败。奇怪的是,为什么不能使用
java.util.concurrent
?@user500796:问题不在于使用纯线程,而是使用了10000个。线程不是自由的,即使从未使用过。出于性能原因,使用多个线程没有任何好处,如果您经常切换10000个线程的上下文,那么性能将非常糟糕。考虑使用非阻塞IO,协同程序,或其他机制,如果你正在尝试规模。因为我们正在处理低延迟的应用程序,我们预计每秒大约7020最大的请求到最坏的情况。所有的请求都需要尽快处理和调度。不接受延迟。限制条件是不使用并发包。只需要使用佩林Java线程。可能是个坏主意。但当我提供足够的内存空间时,对创建线程的数量并将其保持在可运行模式没有限制。它在2156左右失败。奇怪的是,为什么不能使用java.util.concurrent
?@user500796:问题不在于使用纯线程,而是使用了10000个。线程不是自由的,即使从未使用过。出于性能原因,使用多个线程没有任何好处,如果您经常切换10000个线程的上下文,那么性能将非常糟糕。考虑使用非阻塞IO,协同程序,或其他机制,如果你正在尝试规模。因为我们正在处理低延迟的应用程序,我们预计每秒大约7020最大的请求到最坏的情况。所有的请求都需要尽快处理和调度。不耽搁,伙计们,真是太好了