【问题标题】:How to determine Hotspot VM default thread stack size如何确定 Hotspot VM 默认线程堆栈大小
【发布时间】:2014-06-26 11:11:57
【问题描述】:

如果我像这样从 Windows 框上的命令行运行 java:

"C:\Program Files (x86)\Java\jdk1.7.0_51\bin\java.exe" -XshowSettings:all -Xss=1m -Xmx256m

我看到了这个输出:

VM settings:
Stack Size: 1.00M
Max. Heap Size: 256.00M
Ergonomics Machine Class: client
Using VM: Java HotSpot(TM) Client VM

对我来说重要的部分是“堆栈大小:1.00M”,这是我通过命令行选项“-Xss1m”设置的。但是,如果我删除此选项并让 VM 以默认堆栈大小运行,我会得到以下输出:

VM settings:
Max. Heap Size: 256.00M
Ergonomics Machine Class: client
Using VM: Java HotSpot(TM) Client VM

请注意,它不再显示“堆栈大小”。如果我没有指定自定义“-Xss”值,我希望能看到默认大小。有什么方法可以确定默认的线程栈大小吗?

【问题讨论】:

  • 试试-XX:+PrintFinalFlags
  • @Peter Lawrey -XX:+PrintFinalFlags 是我的 java vm 的“无法识别的 VM 选项”。不过感谢您的建议。
  • 糟糕,您需要另一个选项来使用它。 stackoverflow.com/questions/10486375/print-all-jvm-flags
  • 啊,现在这向我展示了很多东西。当我在命令行上设置“-Xss1m”之间切换时,“-XX:+PrintFlagsFinal”输出中唯一改变的值是“ThreadStackSize”,如果我设置“-Xss1m”则显示 1024,如果我设置“-Xss1m”则显示“0”离开“-Xss1m”。我猜 0 不是线程堆栈大小的真正默认值,或者我想什么都不会运行。

标签: java jvm jvm-hotspot


【解决方案1】:

Windows 应用程序的默认堆栈大小在.exe 文件头中指定。
您可以使用 Cygwin objdump 工具或 Microsoft Visual Studio dumpbin 实用程序找到它:

C:\Program Files\Java\jdk1.7.0_51\bin> objdump -p java.exe | grep Stack
SizeOfStackReserve      0000000000100000
SizeOfStackCommit       0000000000001000

C:\Program Files\Java\jdk1.7.0_51\bin> dumpbin.exe /headers java.exe | grep stack
      100000 size of stack reserve
        1000 size of stack commit

如我们所见,Java 7 x64 默认堆栈大小为 0x100000 (1 MB)。
对于 x86 版本,默认堆栈大小为 0x50000 (320 KB):

C:\Program Files (x86)\Java\jre7\bin>objdump -p java.exe | grep Stack
SizeOfStackReserve      00050000
SizeOfStackCommit       00001000

【讨论】:

  • 澄清一下:HotSpot JVM 使用本机 OS 堆栈作为 Java 堆栈。如果未给出-Xss,则默认Java 线程堆栈大小等于Windows 上的OS 堆栈大小。
  • 我能够按照您建议的方式使用“objdump”,而且效果很好。感谢您简洁明了的回答。
猜你喜欢
  • 2010-09-15
  • 2017-07-14
  • 1970-01-01
  • 2012-09-09
  • 2010-12-13
  • 2011-07-27
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多