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

时间:2010-11-09 03:38:48

标签: java linux multithreading threadpool redhat

我写了一个引用http://www.informit.com/articles/article.aspx?p=30483&seqNum=5

的线程池类

环境:Windows7 4 cp

在Windows 7中用70,000个线程执行我的程序,在JDK 1.5下它成功完成。没用过vm参数。

我尝试在Linux企业版中使用5,000 Thread执行相同的代码,该版本位于具有4GB基本内存的Virtual Box下。使用vm参数-xms512m -xmx1024m。它执行到2156个线程并抛出异常

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

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

我可以知道为什么会出现这种错误。这个java代码是否需要1GB内存来运行Just 5,000 Threads?...

我的实际要求是持有一个包含10,000个Workthread的ThreadPool。

4 个答案:

答案 0 :(得分:4)

  

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

线程需要一个必须具有初始大小的堆栈。对于线程,初始堆栈大小默认为堆栈大小资源限制,如ulimit -s所示,但可以通过调用pthread_attr_setstacksize()来更改。 (见另一个SO question)。

答案 3 :(得分:0)

你是64位吗?

不要指望32位机器能够运行大量线程。您可能还希望调整堆栈大小。启动大量线程会为堆栈使用大量内存,除非可以容忍较小的堆栈,否则无法绕过它。

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