64位Linux上的Java线程堆栈大小

时间:2011-08-03 07:32:08

标签: java linux multithreading jvm stack-size

我的目标是提出可以并行运行的最大线程数。谷歌指出了许多链接,他们通过划分RAM / StackSize来提供简单的数学运算。在64位Linux中,我们将线程堆栈大小定义为10 MB(ulimit -s = 10240kb),RAM为4GB,为操作系统留下1 GB并且使用此数学运算我可以拥有~300个线程,但是小型测试应用程序,我写到最高~32297,然后给出内存不足错误。

我用-Xss尝试了不同的值,但是这些值对线程数几乎没有任何影响,它仍然与~32297相同)。

这给我的印象是堆栈大小是可变的并且由OS决定并且在我需要的时候达到我们定义的最大值,但无论我在哪里阅读,它们的堆栈大小都是静态的

我到底错过了什么?

5 个答案:

答案 0 :(得分:4)

尝试使用

检查/更改linux最大堆栈大小
ulimit -s

同时检查linux线程限制

cat /proc/sys/kernel/threads-max  

答案 1 :(得分:3)

我还发现Java中的线程限制大约为32K。如果你有这么多线程,通常使用不同的方法更好。在我的机器上,执行while(true) Thread.sleep(1000)的32K线程将消耗3个核心,只需上下文切换。

Java: What is the limit to the number of threads you can create?

答案 2 :(得分:3)

  

Linux间接实现每个进程的最大线程数!!

number of threads = total virtual memory / (stack size*1024*1024)

因此,可以通过增加总虚拟内存或减少堆栈大小来增加每个进程的线程数。但是,过多地减少堆栈大小会导致代码失败,因为堆栈溢出,而最大虚拟内存等于交换内存。

检查你的机器:

虚拟内存总量:ulimit -v(默认为无限制,因此您需要增加交换内存以增加此值)

总堆栈大小:ulimit -s(默认为8Mb)

增加这些值的命令:

ulimit -s newvalue

ulimit -v newvalue

*将新值替换为您想要设置为限制的值。

<强>参考文献:

http://dustycodes.wordpress.com/2012/02/09/increasing-number-of-threads-per-process/

答案 3 :(得分:0)

当限制为地址空间(2 ^ 32)时,您所阅读的内容仅在32位架构中有效。你实际上有类似的东西:Xmx + MaxPermSize +(Xss *线程数)&lt;最大地址空间OS允许用户进程。根据操作系统和物理硬件的不同,你就像3Go一样。但这与RAM无关。

对于64位架构,您的地址空间不会受到限制(2 ^ 64)。您应该像上面有人所说的那样查看操作系统限制。

答案 4 :(得分:0)

这是因为pid_max内核变量默认为32768,但对于64位系统,可能会增加到4百万。 解释很简单1 thread = 1进程将有1个PID(进程ID)所以不再有pid,没有更多的线程。