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 mitjava 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.
Vielleicht kann jemand mit einem anderen vm auf seiner Maschine überprüfen? Ich verwendete groovy 2.3.9 für das Skript ... – user2078148
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