我写了一个引用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。
答案 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堆栈,所以你真的要小心。