在哪里可以找到Sun / Oracle JVM的默认XSS值?

时间:2011-05-16 16:46:48

标签: java jvm stack size

有没有人为不同版本的Sun / Oracle JVM以及不同的操作系统找到一个列出default XSS sizes的JVM文档?

我已经能够在jrockit jdk 5.0 docs中找到此表,但这对使用“普通”Sun / Oracle JVM的用户没有帮助。

我确实感谢XSS值因操作系统(和JVM版本)而异,因此可能没有一个文档列出了所有最近的组合。但是,如果这里有任何读者知道任何单独的文档,至少列出每个 JVM版本(或至少1.6和1.5)的默认XSS值,或者即使只是一些 OS,这将是一个很好的开始。

我要补充一点,这是有价值的原因是我们经常看到人们推荐(错误的,我认为)有人可以通过更改XSS值来解决问题。但是如果你不知道自己的默认值,那么就无法知道你是否通过某人推荐的改变来提高或降低价值。他们通常不会指出他们所使用的版本/操作系统,因此他们的建议是否会“帮助”你是一个废话。

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

6 个答案:

答案 0 :(得分:68)

尝试:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

答案 1 :(得分:21)

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

  

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

     

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

     

您可以使用-Xss选项运行来减少堆栈大小。例如:

     

java -server -Xss64k

     

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

     

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

答案 2 :(得分:5)

您可以在“-XX:ThreadStackSize”选项下找到它at Oracle site,这意味着与-Xss相同。

答案 3 :(得分:3)

对于热点,它取决于您的架构,什么不是。

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

google code search (编辑:此服务已被停用,因为这个答案已经做了,遗憾的是) 更新:这是来自Nebelmann的新链接:Openjdk source: globals_windows_x86.hpp

不确定这是否有帮助,但它是一个开始

答案 4 :(得分:2)

IBM Java 6用户指南(source)提供了默认设置:

Java线程32位的

Xss< size>

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

答案 5 :(得分:1)

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

这里至少更清楚一点:由于 Java 11 是(2021 年)Oracle JVM 的当前最新 LTS(长期支持版本)版本,我找到了该当前版本的文档,其中列出了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 位):1024 KB
  • Oracle Solaris/x64(64 位):1024 KB
  • Windows:默认值取决于虚拟内存

遗憾的是,Windows 用户仍然想知道:这意味着什么,“取决于虚拟内存”?我想这当然意味着 Windows 本身的虚拟内存,但即使如此,我们如何将其转换为我们应该期望的 jvm 线程的实际堆栈大小?

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

10 年后,我想这是一个可能无法完成的神秘任务。但谁知道呢,也许现在或将来看到这一点的人可能会带着新信息前来救援。或者 Java 17(预期的下一个 LTS 版本)可能会改变事情。 (需要明确的是,在我编写时,没有我共享的该页面的版本,适用于 Java 13 或更高版本。)

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