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

64位linux上的Java线程堆栈大小,java,linux,multithreading,jvm,stack-size,Java,Linux,Multithreading,Jvm,Stack Size,我的目标是找出可以并行运行的最大线程数。我被谷歌指向了很多链接,他们通过除以RAM/StackSize给出了简单的数学。在64位Linux中,我们将线程堆栈大小定义为10MB(ulimit-s=10240kb),RAM为4GB,留给操作系统1GB,根据这个数学,我可以有大约300个线程,但我编写的小测试应用程序高达32297,然后出现内存不足错误 我用-Xss尝试了不同的值,但这些值对线程数几乎没有任何影响,与~32297)相同 这给我的印象是,堆栈大小是可变的,由操作系统决定,并在需要时达到我

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

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

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


这里我到底遗漏了什么?

您所阅读的内容只有在32位体系结构中,当限制为地址空间(2^32)时才有效。实际上,您有这样的功能:Xmx+MaxPermSize+(Xss*线程数)<操作系统允许用户进程的最大地址空间。根据操作系统和物理硬件的不同,您可以像您所说的那样使用3Go。但这与RAM无关


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

尝试使用

ulimit -s
还要检查linux线程限制

cat /proc/sys/kernel/threads-max  

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

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

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

检查您的机器:

ulimit -s newvalue

ulimit -v newvalue
总虚拟内存:
ulimit-v
(默认值是无限的,因此需要增加交换内存以增加该值)

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

增加这些值的命令:

ulimit -s newvalue

ulimit -v newvalue
*将新值替换为要设置为限制的值

参考文献:

ulimit -s newvalue

ulimit -v newvalue

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

您可能会受到内核的限制,因为您可以拥有与处理器或内核一样多的线程来真正并行运行。否则JVM调度程序会随意将它们交错。@Joachim:我读了这篇文章,谢谢。.你能建议一下threads max变量背后的决定因素吗?max变量的值是81920,堆栈大小是10 MB,RAM是4 GB。无法通过计算得到这些数字——在所有这些检查之后,我的问题就解决了。cat/proc/sys/kernel/threads max是81920。我想知道b/w ulimit-s和threads max之间的关系,如果我更改堆栈大小,threads max value是否会更新?在您共享的链接中,他们提到64位上的堆栈大小为128K,限制为32072,堆栈大小为512K,限制再次为32072。您知道为什么堆栈大小对可以创建的线程数没有任何影响吗?好的,仍然没有回答的问题是,为什么即使将堆栈大小更改为非常大或非常小的值,最大线程数仍然相同。操作系统是否动态选择堆栈大小?