Linux中一个Java虚拟机可以支持多少线程?

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

我编写了线程池类

环境: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个工作线程的线程池


我想你需要重新考虑一下你的要求。这绝不是一个好主意,对性能来说是灾难性的。

正如@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最大的请求到最坏的情况。所有的请求都需要尽快处理和调度。不耽搁,伙计们,真是太好了