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



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

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

这给我的印象是堆栈大小是可变的,由操作系统决定,并在需要时上升到我们定义的最大值,但无论我读到哪里,他们大小堆栈大小是静态的

我到底错过了什么?

尝试使用

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

还检查linux线程限制

cat /proc/sys/kernel/threads-max  

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

Java:你可以创建的线程数的限制是多少?

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/

当限制是地址空间(2^32)时,您所读取的内容仅在32位体系结构中有效。你可以得到这样的结果:Xmx + MaxPermSize + (Xss *线程数)<操作系统允许用户进程的最大地址空间。根据操作系统和物理硬件的不同,就像你说的3Go。但这与RAM无关。>

对于64位体系结构,您的地址空间将不受限制(2^64)。你应该像上面所说的那样考虑操作系统的限制。

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

最新更新