Я просто хочу контролировать размер стека для всех моих потоков в приложении 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.