В чем разница между -Xss и -XX: ThreadStackSize?

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

Ответ 1

-Xss - стандартные параметры, распознаваемые виртуальной машиной Java HotSpot.

-XX:ThreadStackSize, поскольку другие опции -XX нестабильны и могут быть изменены без уведомления.

См. Параметры Java HotSpot VM

Ответ 2

-Xss является псевдонимом для -XX:ThreadStackSize как для OpenJDK, так и для Oracle JDK.

Хотя они анализируют аргументы по-разному:
-Xss может принимать число с суффиксом K, M или G.
-XX:ThreadStackSize= ожидает целое число (без суффикса) - размер стека в килобайтах.

Ответ 3

-Xss работает только на main Java thead, но -XX:ThreadStackSize работает во всех потоках Java.

Если -Xss (или -ss) были переданы в командной строке, он попадает непосредственно в пусковую установку и используется позже для создания "основной" поток Java, не запрашивая виртуальную машину для предпочтительного стека потоков размер. То, откуда возникает несогласованность:  если -Xss задается после -XX: ThreadStackSize, тогда все по-прежнему хорошо;  в противном случае "основной" поток Java имел бы размер стека, указанный как -Xss где, как и размер стека других потоков Java, все равно будет следовать ThreadStackSize.

Непоследовательность между -Xss и -XX: ThreadStackSize в java-панели запуска

Ответ 4

ОБНОВЛЕНО 2019 для Java SE 8

Текущие документы 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.