In der Oracle-Dokumentation fand ich:
-Xmxsize Gibt die maximale Größe (in Bytes) des Speicherzuordnungspools in Bytes an ... Der Standard Wert wird zur Laufzeit auf der Grundlage der Systemkonfiguration ausgewählt.
Was bedeutet Systemkonfiguration?
Sie variiert je nach Implementierung und Version, hängt aber in der Regel von der verwendeten VM (z.B. Client oder Server, siehe Parameter -client
und -server
) und von Ihrem Systemspeicher ab.
Häufig ist der Standardwert 1/4 des physischen Speichers oder 1 GB (je nachdem, welcher Wert kleiner ist).
Auch Java-Konfigurationsoptionen (Befehlszeilenparameter) können in Umgebungsvariablen ausgelagert werden, einschließlich der "Xmx"-Variablen, die den Standardwert ändern können (d.h. einen neuen Standardwert festlegen). Insbesondere die Umgebungsvariable JAVA_TOOL_OPTIONS
wird von allen Java-Tools geprüft und verwendet, wenn sie vorhanden ist (mehr Details hier und hier).
Sie können den folgenden Befehl ausführen, um die Standardwerte zu sehen:
java -XX:+PrintFlagsFinal -version
Sie erhalten eine sehr lange Liste, -Xmx
ist in MaxHeapSize
, -Xms
ist in InitialHeapSize
. Filtern Sie Ihre Ausgabe (z.B. |grep
unter Linux) oder speichern Sie sie in einer Datei, damit Sie darin suchen können.
Wie Sie bereits erwähnt haben, hängt die standardmäßige -Xmxsize
(maximale HeapSize) von Ihrer Systemkonfiguration ab.
**Java8 benötigt mehr als 1/6 des physischen Speichers für die "Xmssize" (minimale HeapSize) und weniger als 1/4 des physischen Speichers für die "Xmxsize" (maximale HeapSize).
Das heißt, wenn Sie einen physischen Speicher von 8 GB RAM haben, wird Xmssize
größer als 8(1/6) und -Xmxsize
kleiner als 8(1/4) sein.
Sie können Ihre Standard-HeapSize mit überprüfen.
In Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Unter Linux:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Diese Standardwerte können auch auf die von Ihnen gewünschte Menge überschrieben werden.
Überraschenderweise gibt es auf diese Frage keine endgültige dokumentierte Antwort. Vielleicht würde ein weiterer Datenpunkt für andere, die nach einer Antwort suchen, von Nutzen sein. Auf meinen Systemen mit CentOS (6.8,7.3) und Java 8 (build 1.8.0_60-b27, 64-Bit Server):
Der Standardspeicher ist 1/4 des physischen Speichers und nicht durch 1 GB begrenzt.
Außerdem wird -XX:+PrintFlagsFinal
auf STDERR gedruckt, so dass der Befehl zur Bestimmung des aktuellen Standardspeichers, der von anderen oben vorgestellt wurde, wie folgt geändert werden sollte:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
Das Folgende wird auf einem System mit 64 GB physischem RAM zurückgegeben:
uintx MaxHeapSize := 16873684992 {product}