2015-02-27 7 views
10

Ich möchte nur die Stapelgröße für alle meine Threads in einer Java (groovy) -Anwendung steuern. Für die Hotspot Oracle VM weiß ich, dass es zwei Parameter gibt (-Xss und XX:ThreadStackSize).Was ist der Unterschied zwischen -Xss und -XX: ThreadStackSize?

Welches ist das bevorzugte? Gibt es einen Unterschied zwischen ihnen? In Bezug auf Open JDK 7 someone asked on the mailing list, dass -Xss ist die gleiche für die Hotpot VM wie -XX:ThreadStackSize.

Der Punkt ist, dass ich messe, wie viele Threads auf meinem System gestartet werden können. Mein groovy Skript, das dies tut wie folgt aussieht:

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 
} 

Interessanterweise bekomme ich nur eine reduzierte Anzahl von Threads mit - XX:ThreadStackSize. Ich starte die Groovy-Anwendung mit und mit unterschiedlichem Inhalt in der Umgebungsvariablen JAVA_OPTS.

groovy countmax-threads.groovy 

Als ich JAVA_OPTS auf -XX:ThreadStackSize=2m gesetzt, bekomme ich etwa 1000 Themen, bis der Speicher verbraucht wird. Aber wenn ich JAVA_OPTS='-Xss2m' verwende, bekomme ich etwa 32000 Threads, bis der erwartete Fehler auftritt. So scheint es, dass -Xss überhaupt nicht funktioniert.

I

bin mit

java version "1.8.0_05"
Java (TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot (TM) 64-Bit Server VM (Build 25.5 -b02, gemischter Modus)

auf einem Ubuntu 14.04 64-Bit-Rechner mit vier Hardware-Threads und etwa 8 GB RAM.

UPDATE:

ich erneut verifiziert diese auf meinem Windows 7 64-Bit-Maschine und ein anderes JDK:

java version "1.8.0_20" Java (TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot (TM) 64-Bit Server VM (25,20-b23, mixed mode)

und dort -Xss und -XX:ThreadStackSize wie erwartet bauen (wie einige Antworten darauf hingewiesen). Ich nehme an, es ist ein Linux-spezifisches Problem oder sogar ein Fehler in der JDK-Version 1.8.05.

+0

Vielleicht kann jemand mit einem anderen vm auf seiner Maschine überprüfen? Ich verwendete groovy 2.3.9 für das Skript ... – user2078148

+0

Gleiches Verhalten auf Linux: Java-Version "1.8.0_45" Java (TM) SE Laufzeitumgebung (Build 1.8.0_45-b14) Java HotSpot (TM) 64- Bit Server VM (Build 25.45-b02, gemischter Modus) Scheint mir wie ein Linux-spezifisches JVM-Problem ... – user2078148

Antwort

3

-Xss ist die Standardoption, die von der Java HotSpot VM erkannt wird.

-XX:ThreadStackSize wie andere -XX Optionen sind nicht stabil und können sich ohne vorherige Ankündigung ändern.

Siehe Java HotSpot VM Options

+2

Warum unterscheidet sich das Verhalten? – user2078148

+1

@ user2078148 Dis Sie den Java-Hotspot von Oracle herunterladen? Der Link, in dem angegeben wird, dass -Xss und -XX: ThreadStackSize gleichwertig sind, bezieht sich auf openjdk. Openjdk und Oracle Hotspot VM können sich unterscheiden. Siehe http://stackoverflow.com/a/11580321/1140748. Also -XX: ThreadStackSize, das möglicherweise fehlschlägt, weil -XX-Optionen nicht stabil sind. –

+0

Vielen Dank für Ihren Vorschlag ... aber warum dann -XX: ThreadStackSize = 2m funktioniert einfach und -Xss nicht? – user2078148

5

-Xss ist ein Alias ​​für -XX:ThreadStackSize sowohl für OpenJDK und Oracle JDK.

Obwohl sie Argumente anders analysieren:
-Xss kann eine Zahl mit K, M oder G Suffix akzeptieren;
-XX:ThreadStackSize= erwartet eine Ganzzahl (ohne Suffix) - die Stapelgröße in Kilobyte.

+0

Nun, ich habe keine Probleme bei der Angabe -XX: ThreadStackSize = 2m, obwohl Sie Recht haben, sagen die Dokumente, was Sie mir gesagt haben ... aber das alles macht es nicht klar – user2078148

2

-Xss funktioniert nur auf main Java thead, aber -XX:ThreadStackSize funktioniert auf allen Java-Thread.

Wenn -Xss (oder -SS) auf der Kommandozeile übergeben wurden, es von der Trägerrakete direkt abgeholt wird und verwendet wird, später den „main“ Java-Thread zu erstellen, ohne die die VM zu fragen bevorzugter Fadenstapel Größe. Wo Inkonsistenz herkommt: Wenn -Xss nach -XX: ThreadStackSize gegeben ist, dann sind die Dinge immer noch gut; andernfalls hätte der Java-Hauptthread eine Stapelgröße, die durch -Xss angegeben wird, wobei die Stapelgröße anderer Java-Threads weiterhin der von ThreadStackSize entspricht.

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

+0

Die zitierte Mailingliste Beitrag scheint zu gelten JDK 6 und 7. Für JDK 8 werde ich das auf meinem lokalen Rechner erneut überprüfen. Du Hinweis war wirklich nützlich, danke! – user2078148

+2

Nachdem ich den Mailinglistenbeitrag von Kris Mok im Detail studiert habe, muss ich dich korrigieren. -Xss funktioniert auch für die Thread-Stack-Größe als -XX: ThreadStackSize. Das Problem tritt auf, wenn Sie beide gleichzeitig verwenden (in der Reihenfolge -Xss -XX: ThreadStackSize). In diesem Fall wird vm den in -Xss angegebenen Wert nur für den Hauptthread und den in -XXThreadStackSize für alle anderen Benutzerthreads angegebenen Wert übernehmen. Diese beiden Optionen sollten gleichwertig sein! Man muss vorsichtig sein, wenn beide verwendet werden (was normalerweise keinen Sinn macht) – user2078148

+0

@ user2078148 Ja, Sie haben Recht ~ – lichengwu

Verwandte Themen