Java VM在Linux中支持多少个线程?

问题描述:

我写线程池类指http://www.informit.com/articles/article.aspx?p=30483&seqNum=5Java VM在Linux中支持多少个线程?

环境:Windows7的4 CP

在Windows 7中执行的程序我七万主题,JDK 1.5下,它通过成功地去了。没有使用vm参数。

我试着用5000个线程在Linux企业版中执行相同的代码,这个代码是在带有4GB基本内存的Virtual Box下。使用vm参数-xms512m -xmx1024m。它执行,直到2156个线程和抛出线程异常

异常“主要” java.lang.OutOfMemoryError:无法在java.lang中的java.lang.Thread.start0(本机方法) 创建新的本地线程 。 Thread.start(Thread.java:597) 在testthreadpool.ThreadPool。(ThreadPool.java:38) 在testthreadpool.TestThreadPool.main(TestThreadPool.java:16)

但是在Windows7完美运行相同的代码。

我可以知道为什么会发生此错误。这个java代码需要1GB内存运行只有5,000线程?...

我的实际要求是保持一个ThreadPool 10,000工作线程。

My actual requirement is to hold a ThreadPool with 10,000 Workthread.

我认为你需要重新审视你的需求。这绝不是一个好主意,对性能来说是灾难性的。

+0

约束不是使用并发包。只需要使用palin Java Thread。 – user500796 2010-11-09 03:46:14

+0

可能是坏主意。但是,当我给出足够的内存空间时,创建多个线程并将其保持在可运行模式没有限制。它在2156年左右失败。 – user500796 2010-11-09 03:46:33

+0

好奇,为什么你不能使用'java.util.concurrent'? – Jeremy 2010-11-09 04:00:48

正如@Yann指出的,使用10,000个线程是一个非常糟糕的主意......除非你有一台拥有数千个内核的机器。你应该认真看待你的应用程序设计。

在短期内,尝试使用-Xss... JVM参数调整默认线程堆栈大小。另请注意,堆栈未分配到堆内存中,因此您的-Xms512m -Xmx1024m选项不会为堆栈预留空间。相反,它是预留空间,不能然后用于堆栈。

最后,可能是其他事情(除了线程堆栈的内存),它将限制应用程序可以创建的线程数。

+0

真正有帮助的伙计们。我做了调整并能够创建6000用于测试目的。我们建议我们考虑减少线程数。 – user500796 2010-11-23 02:07:33

线程需要一个堆栈,它必须有一个初始大小。对于线程,初始堆栈大小默认为堆栈大小资源限制,如ulimit -s所示,但可通过致电pthread_attr_setstacksize()进行更改。 (见其他SO question)。

你在64位?

不要指望32位机器能够运行大量的线程。你也可能希望调整堆栈大小。开始大量的线程使用大量的内存来堆栈,除非你能容忍更小的堆栈,否则你无法解决这个问题。

检查x86_64,Linux似乎默认为8M堆栈,这意味着1k线程需要8G堆栈,所以你真的想小心这一点。