Как определить размер стека потоков Hotspot VM по умолчанию

Если я запускаю java из командной строки в своем окне Windows следующим образом:

"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,00 МБ», который я установил с помощью параметра командной строки «-Xss1m». Но если я удалю эту опцию и позволю виртуальной машине работать с размером стека по умолчанию, я получу следующий вывод:

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

Обратите внимание, что больше не отображается «Размер стека». Я надеялся, что увижу размер по умолчанию, если не укажу пользовательское значение «-Xss». Есть ли способ определить размер стека потока по умолчанию?


person BenjaminLinus    schedule 08.05.2014    source источник
comment
попробуй -XX:+PrintFinalFlags   -  person Peter Lawrey    schedule 09.05.2014
comment
@Peter Lawrey -XX:+PrintFinalFlags - это параметр Неопознанная виртуальная машина для моего java vm. Спасибо за предложение.   -  person BenjaminLinus    schedule 09.05.2014
comment
К сожалению, вам нужен другой вариант, чтобы использовать его. stackoverflow.com/questions/10486375/print-all-jvm-flags   -  person Peter Lawrey    schedule 09.05.2014
comment
Ааа, теперь это показывает мне массу вещей. Когда я переключаюсь между настройками -Xss1m в командной строке, единственное значение, которое изменяется в выводе из -XX:+PrintFlagsFinal, — это ThreadStackSize, которое показывает 1024, если я устанавливаю -Xss1m, и показывает 0, если я оставляю -Xss1m. Я предполагаю, что 0 не является истинным значением по умолчанию для размера стека потоков, или я думаю, что ничего никогда не запустится.   -  person BenjaminLinus    schedule 09.05.2014


Ответы (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 МБ).
Для версии x86 размер стека по умолчанию составляет 0x50000 (320 КБ):

C:\Program Files (x86)\Java\jre7\bin>objdump -p java.exe | grep Stack
SizeOfStackReserve      00050000
SizeOfStackCommit       00001000
person apangin    schedule 08.05.2014
comment
Просто для уточнения: HotSpot JVM использует собственный стек ОС в качестве стека Java. Если -Xss не указано, размер стека потока Java по умолчанию равен размеру стека ОС в Windows. - person apangin; 09.05.2014
comment
Я смог использовать objdump так, как вы предложили, и это сработало отлично. Спасибо за ваш четкий и лаконичный ответ. - person BenjaminLinus; 09.05.2014