2015-02-27 10 views
10

Voglio solo controllare la dimensione dello stack per tutti i miei thread in un'applicazione Java (groovy). Per l'hotspot Oracle VM, so che ci sono due parametri che lo fanno (-Xss e XX:ThreadStackSize).Qual è la differenza tra -Xss e -XX: ThreadStackSize?

Qual è il preferito? C'è qualche differenza tra loro? Per quanto riguarda Open JDK 7 someone asked on the mailing list, affermando che -Xss è lo stesso per la Hotpot VM come -XX:ThreadStackSize.

Il punto è che sto misurando quanti thread possono essere avviati sul mio sistema. Il mio script Groovy che fa questo assomiglia a:

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 
} 

È interessante notare che ottengo solo un numero ridotto di di fili che utilizzano - XX:ThreadStackSize. Sto iniziando l'applicazione groovy con e con contenuti diversi nella variabile d'ambiente JAVA_OPTS.

groovy countmax-threads.groovy 

Quando ho creato JAVA_OPTS a -XX:ThreadStackSize=2m, ottengo circa 1000 le discussioni iniziate finché non si consuma la memoria. Tuttavia, quando utilizzo JAVA_OPTS='-Xss2m', ottengo circa 32000 thread fino a quando non si verifica l'errore previsto. Quindi sembra che -Xss non funzioni affatto.

Sto usando

versione java "1.8.0_05"
Java (TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot (TM) a 64 bit di server VM (build 25.5 -b02, modalità mista)

su una macchina Ubuntu 14.04 64 bit con quattro thread hardware e circa 8 GB di RAM.

UPDATE:

ho nuovamente verificata questo sul mio Windows 7 a 64 bit e macchine un'altra JDK:

versione java "1.8.0_20" Java (TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot (TM) a 64 bit di server VM (build 25.20-b23, modalità mista)

e ci -Xss e -XX:ThreadStackSize lavoro come previsto (come alcune risposte hanno sottolineato). Quindi suppongo che sia un problema specifico di Linux o anche un bug nella versione JDK 1.8.05.

+0

Forse qualcuno può verificare sulla sua macchina con un altro vm? Ho usato groovy 2.3.9 per lo script ... – user2078148

+0

Stesso comportamento su linux: versione java "1.8.0_45" Java (TM) SE Runtime Environment (build 1.8.0_45-b14) Java HotSpot (TM) 64- Bit Server VM (build 25.45-b02, modalità mista) Mi sembra un problema JVM specifico per Linux ... – user2078148

risposta

3

-Xss è le opzioni standard riconosciute da Java HotSpot VM.

-XX:ThreadStackSize come altre opzioni -XX non sono stabili e sono soggette a modifiche senza preavviso.

Vedi Java HotSpot VM Options

+2

Perché il comportamento differisce? – user2078148

+1

@ user2078148 Si scarica l'hotspot java da Oracle? Il link in cui è affermato che -Xss e -XX: ThreadStackSize sono equivalenti riguarda openjdk. Openjdk e Oracle Hotspot VM potrebbero essere diversi. Vedi http://stackoverflow.com/a/11580321/1140748. Quindi -XX: ThreadStackSize che potrebbe fallire perché le opzioni -XX non sono stabili. –

+0

Grazie per il tuo suggerimento ... ma perché -XX: ThreadStackSize = 2m funziona e -Xss no? – user2078148

5

-Xss è un alias per -XX:ThreadStackSize sia per OpenJDK e Oracle JDK.

Sebbene analizzino gli argomenti in modo diverso:
-Xss può accettare un numero con suffisso K, M o G;
-XX:ThreadStackSize= prevede un numero intero (senza suffisso): la dimensione dello stack in kilobyte.

+0

Beh, non ho riscontrato problemi nella specifica -XX: ThreadStackSize = 2m, se hai ragione, i documenti dicono quello che mi hai detto ... ma tutto questo non lo rende chiaro – user2078148

2

-Xss funziona solo su main Java, ma -XX:ThreadStackSize funziona su tutto il thread Java.

Se -Xss (o -ss) sono stati passati sulla riga di comando, esso viene raccolto direttamente dal programma di avvio e viene utilizzato in seguito per creare il thread "principale" Java , senza chiedere il VM per la dimensione preferita pila dimensioni. Quello da cui deriva l'incoerenza: se -Xss è dato dopo -XX: ThreadStackSize, allora le cose sono ancora buone; in caso contrario, il thread Java "principale" avrebbe una dimensione di stack specificata da -Xss dove le dimensioni dello stack di altri thread Java continuerebbero ugualmente a quella di ThreadStackSize.

Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher

+0

Il post citato della mailing list sembra fare domanda per JDK 6 e 7. Per JDK 8, lo verificherò di nuovo sul mio computer locale. Il suggerimento è stato davvero utile, grazie! – user2078148

+2

Ben dopo aver studiato dettagliatamente il post sulla mailing list di Kris Mok, devo correggerti. -Xss funzionerà per le dimensioni dello stack di thread come -XX: ThreadStackSize. Il problema sorge quando si utilizzano entrambi allo stesso tempo (nell'ordine -Xss -XX: ThreadStackSize). In questo caso, vm raccoglierà il valore specificato in -Xss solo per il thread principale e il valore specificato in -XXThreadStackSize per tutti gli altri thread utente. Queste due opzioni dovrebbero essere equivalenti! Si deve fare attenzione quando si usano entrambi (che di solito non ha senso) – user2078148

+0

@ user2078148 Sì, hai ragione ~ – lichengwu