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

cha*_*art 56 java size stack jvm

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

我已经能够在jrockit jdk 5.0 docs中找到这个表,但这对那些使用"普通"Sun/Oracle JVM的人没有帮助.

我确实感谢XSS每个操作系统(和JVM版本)的值会有所不同,所以可能没有一个文档列出了所有最近的组合.但是,如果这里的任何读者都知道任何单个文档至少列出每个 JVM版本(或至少1.6和1.5)的默认XSS值,或者即使仅针对某些操作系统,那将是一个很好的开始.

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

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

plo*_*ckc 73

尝试:

java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很有希望(对于Windows用户,你会使用find"ThreadStackSize"代替),但它只是将0报告为ThreadStackSize的值.我不认为这意味着大小为0.虽然有些人可能会说这表明它正在使用"默认",但这只会让我们回到我的问题:什么是默认的XSS值给定JVM?我不敢相信这在3.5年内仍然无法回答.仍然对任何参赛者开放,并感谢所有其他人尝试到目前为止. (10认同)
  • @Scot这里的单位是什么?KB还是字节? (2认同)
  • @Rohit,大小以千字节为单位存储:https://bugs.openjdk.java.net/browse/JDK-8145458 (2认同)
  • 晚了将近五年......使用`java -XX:+PrintFlagsFinal -version`显示ThreadStackSize应该是1024k,但实际上它似乎是64Mb,如`/proc/<pid>/maps`所示. 是的,将 `-Xss` 更改为例如 4Mb (`java -Xss4m`) 并比较 `/proc/<pid>/maps` 确认“某事”,我认为是线程堆栈分配,从 64Mb 减少到 4Mb。我使用这个小工具来显示内存段大小,https://gist.github.com/cosimo/e90a9f6daa1fbdc62a89843cf27f005a 最后,要显示正在运行的进程的 JVM 标志,请改用 `jcmd <pid> VM.flags`。 (2认同)

Ben*_*Ben 23

此信息现在显示在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是每个线程允许的最小堆栈空间量.

  • 谢谢,本.这是最直接的潜在答案,但有一个小问题:技术说明似乎是指Java旧版本("1.4"和"SE 5.0"和"SE 6").可能是Java 7或8的信息不再准确.对细节感兴趣的人应该注意到这一点.但是现在似乎证实,在Windows中,唯一真正知道的方法就是查看源代码.善良.(至少从Java 6开始,至少可以说32/64位Windows的内容!) (2认同)

cha*_*art 16

这个问题的答案首次发布于 2011 年,从那以后的几年里得到了各种各样的答案,这是一次多么漫长、奇怪的旅程。有些人建议使用-XX:+PrintFlagsFinalJVM 参数,这对大多数人来说可能是最好的,但对 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 线程的实际堆栈大小?

回到我最初的问题:我想知道默认值是什么,因为经常有人建议解决某些问题是更改-XSSjvm arg(更改为他们建议的某个值)。但是我们如何知道我们是否将其设置为大于或小于默认值呢?根据要解决的问题,了解这一点至关重要!

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

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


key*_*ess 5

您可以在Oracle站点的 "-XX:ThreadStackSize"选项下找到它,这意味着与-Xss相同.