在哪里可以找到 Oracle JVM 的 default-Xss (堆栈大小)值?

有没有人发现过一个 JVM 文档列出了不同版本的 Oracle JVM 和不同操作系统的默认 -Xss值?

我已经能够在 Jrockit 文档中找到这个表,但是这对于那些使用“普通”Oracle JVM 的人没有帮助。

我很欣赏每个操作系统(和 JVM 版本)的 -Xss值会有所不同,所以可能没有一个文档列出了所有最近的组合。但是,如果这里的任何读者知道有任何单独的文档至少列出了 每个人 JVM 版本(或至少1.6和1.5)的默认 -Xss值,或者甚至只列出了 一些 OS 的默认 -Xss值,那将是一个很好的开始。我对 Windows 的默认设置特别感兴趣。

我要补充的是,这个值的原因是,我们经常看到人们推荐(我认为是错误的)某人可以通过改变 -Xss值来解决问题。但是如果你不知道你的默认值,那么你就没有办法知道你是通过别人建议的任何改变来提高还是降低价值。他们通常不会指明他们所使用的版本/操作系统,所以他们的建议是否能“帮助”你是一个不确定的问题。

比某些文档更好的是,如果有人知道一种方法来查询 JVM 以获得当前值,无论是从命令行还是通过 API 调用,那将是更有价值的。谢谢。

更新: 我添加了 我自己的答案,它总结了各种建议,并指出了当前的资源(在2021年初) 指出答案,包括我所学到的 -Xss值 在 Windows 中

85606 次浏览

对于热点,它取决于您的架构和其他东西。

默认的堆栈大小可以在与给定平台相关的头文件的源代码中找到。

谷歌代码搜索 < em > (编辑: 这项服务已被停用,因为这个答案作出,遗憾) 更新: 这里有一个来自 Nebelmann 的新链接:

不知道这是否有帮助,但这是一个开始

IBMJava6用户指南(来源)提供了默认设置:

Xss < size > for Java Threads 32 bit:

AIX®: 256KB
IBM®I: 256KB
Linux: 256KB
Windows: 256KB
z/OS®: 256KB

您可以在“-XX: ThreadStackSize”选项下找到它 在甲骨文网站,这意味着与-Xss 相同。

此信息现在出现在 Oracle Hotspot FAQ 中 Http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#threads_oom

您可能会遇到线程默认堆栈大小的问题。在 JavaSE6中,Sparc 在32位 VM 中的默认值为512k,在64位 VM 中的默认值为1024k。在 x86 Solaris/Linux 上,32位虚拟机为320k,64位虚拟机为1024k。

在 Windows 上,默认的线程堆栈大小是从二进制文件(java.exe)读取的。在 JavaSE6中,这个值在32位 VM 中为320k,在64位 VM 中为1024k。

您可以通过运行-Xss 选项来减小堆栈大小,例如:

Java-server-Xss64k

注意,在某些版本的 Windows 上,操作系统可能使用非常粗的粒度来综合线程堆栈大小。如果请求的大小比默认大小小1K 或更多,则堆栈大小四舍五入为默认大小; 否则,堆栈大小四舍五入为1MB 的倍数。

64k 是每个线程允许的最小堆栈空间量。

尝试:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

这是一个多么漫长而奇怪的旅程啊,它在2011年首次发布了这个问题的答案,并且在之后的几年里得到了各种各样的答案。一些人建议使用 -XX:+PrintFlagsFinal JVM 参数,这对大多数人来说可能是最好的,但对 Windows 没有帮助(总是报告0)。有些人共享各种资源(针对各种 JVM 和版本) ,其中一些确实试图帮助回答这个问题,但往往没有,或者没有澄清那些可能在 Windows 上运行 Oracle JVM 的人。

这里至少有一点更清晰: Java 11是(在2021年)当前最新的 LTS (长期支持版本)版本的 Oracle JVM,我已经找到了当前版本的文档,其中列出了 XSS (又名 ThreadStackSize)和不同操作系统的特定默认值。在 https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE。下面是它的报告(以防将来链接中断) :

  • Linux/x64(64位) : 1024 KB
  • MacOS (64位) : 1024KB
  • Oracle Solaris/x64(64-bit) : 1024 KB
  • Windows: 默认值取决于虚拟内存

遗憾的是,Windows 用户仍然在思考: “依赖于虚拟内存”是什么意思?当然,我认为它指的是 Windows 本身的虚拟内存,但即便如此,我们如何将其转换为 jvm 线程的实际堆栈大小呢?

回到我最初的问题: 我想知道 违约是什么,因为通常有人会建议解决某个问题的方法是改变 -XSS jvm arg (到他们建议的某个值)。但是我们怎么知道我们让它比默认值大还是小呢?根据正在解决的问题,了解这一点至关重要!

10年后,我想这是一个神话般的探索,可能不会结束。但谁知道呢,也许现在或将来会有人看到这一点,带着新的信息赶来救援。或者 Java17(预期的下一个 LTS 版本)可能会改变一些事情。(需要说明的是,在我写这篇文章的时候,我并没有为 Java13或更高版本共享这个页面。)

如果没有别的,我把这个留给后人,至少帮助其他面对这个问题的人知道,他们并没有疯狂地发现这么难得到一个直接的答案(特别是关于 Windows 的默认 XSS 值,以及改变它是否会提高或降低相对于默认值的大小)。