Ответ 1
-Xss
- стандартные параметры, распознаваемые виртуальной машиной Java HotSpot.
-XX:ThreadStackSize
, поскольку другие опции -XX
нестабильны и могут быть изменены без уведомления.
Я просто хочу контролировать размер стека для всех моих потоков в приложении Java (groovy). Я знаю, что для виртуальной машины Oracle Hotspot это два параметра ( -Xss
и XX:ThreadStackSize
).
Какой из них предпочтительнее? Есть ли разница между ними? Относительно Open JDK 7 кто-то спросил в списке рассылки, заявив, что -Xss
для VM Hotpot совпадает с -XX:ThreadStackSize
.
Дело в том, что я измеряю, сколько потоков можно запустить в моей системе. Мой отличный скрипт, который делает это выглядит так:
int count = 0
def printCountThreads = {
println("XXX There were started $count threads.")
}
try {
while(true){
new Thread({Thread.sleep(Integer.MAX_VALUE)}).start()
count++
if(count % 1000 == 0){
printCountThreads()
}
}
} catch (Throwable e){
printCountThreads()
throw e
}
Интересно, что я просто получаю уменьшенное количество потоков, используя - XX:ThreadStackSize
. Я запускаю Groovy-приложение с различным содержимым в переменной окружения JAVA_OPTS.
groovy countmax-threads.groovy
Когда я устанавливаю JAVA_OPTS на -XX:ThreadStackSize=2m
, я получаю около 1000 запущенных потоков, пока память не будет израсходована. Но когда я использую JAVA_OPTS='-Xss2m'
, я получаю около 32000 потоков, пока не возникнет ожидаемая ошибка. Похоже, что -Xss
не работает вообще.
я использую
Java-версия "1.8.0_05"
Java (TM) SE Runtime Environment (сборка 1.8.0_05-b13)
Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.5-b02, смешанный режим)
на 64-битной машине Ubuntu 14.04 с четырьмя аппаратными потоками и около 8 ГБ ОЗУ.
ОБНОВИТЬ:
Я проверил это на моей 64-битной машине с Windows 7 и другом JDK:
Java-версия "1.8.0_20" Java (TM) SE Runtime Environment (сборка 1.8.0_20-b26) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.20-b23, смешанный режим)
и там -Xss
и -XX:ThreadStackSize
работает как положено (как указывалось в некоторых ответах). Так что я полагаю, что это специфическая проблема Linux или даже ошибка в версии 1.8.05 JDK.
-Xss
- стандартные параметры, распознаваемые виртуальной машиной Java HotSpot.
-XX:ThreadStackSize
, поскольку другие опции -XX
нестабильны и могут быть изменены без уведомления.
-Xss
является псевдонимом для -XX:ThreadStackSize
как для OpenJDK, так и для Oracle JDK.
Хотя они анализируют аргументы по-разному: -Xss
может принимать число с суффиксом K, M или G. -XX:ThreadStackSize=
ожидает целое число (без суффикса) - размер стека в килобайтах.
-Xss
работает только на main
Java thead, но -XX:ThreadStackSize
работает во всех потоках Java.
Если -Xss (или -ss) были переданы в командной строке, он попадает непосредственно в пусковую установку и используется позже для создания "основной" поток Java, не запрашивая виртуальную машину для предпочтительного стека потоков размер. То, откуда возникает несогласованность: если -Xss задается после -XX: ThreadStackSize, тогда все по-прежнему хорошо; в противном случае "основной" поток Java имел бы размер стека, указанный как -Xss где, как и размер стека других потоков Java, все равно будет следовать ThreadStackSize.
Непоследовательность между -Xss и -XX: ThreadStackSize в java-панели запуска
Текущие документы Oracle Java SE 8 предполагают, что -Xss
и -XX:ThreadStackSize=size
эквивалентны. Увидеть
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-Xss
:-Xsssize
Sets the thread stack size (in bytes). Append the
letter k or K to indicate KB, m or M to indicate MB, g or G to
indicate GB. The default value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples set the thread stack size to 1024 KB in different units:
-Xss1m
-Xss1024k
-Xss1048576
This option is equivalent to -XX:ThreadStackSize.
-XX:ThreadStackSize=size
-XX:ThreadStackSize=size
Sets the thread stack size (in bytes). Append the
letter k or K to indicate kilobytes, m or M to indicate
megabytes, g or G to indicate gigabytes. The default
value depends on the platform:
Linux/ARM (32-bit): 320 KB
Linux/i386 (32-bit): 320 KB
Linux/x64 (64-bit): 1024 KB
OS X (64-bit): 1024 KB
Oracle Solaris/i386 (32-bit): 320 KB
Oracle Solaris/x64 (64-bit): 1024 KB
The following examples show how to set the thread stack size to 1024 KB in different units:
-XX:ThreadStackSize=1m
-XX:ThreadStackSize=1024k
-XX:ThreadStackSize=1048576
This option is equivalent to -Xss.