In der Orakel-Dokumentation fand ich:
-Xmxsize Gibt die maximale Größe (in Byte) des Speicherzuordnungspools in Byte an ... Der Standardwert wird zur Laufzeit basierend auf der Systemkonfiguration ausgewählt.
Was bedeutet Systemkonfiguration ?
In der Orakel-Dokumentation fand ich:
-Xmxsize Gibt die maximale Größe (in Byte) des Speicherzuordnungspools in Byte an ... Der Standardwert wird zur Laufzeit basierend auf der Systemkonfiguration ausgewählt.
Was bedeutet Systemkonfiguration ?
-Xmx
zumindest in Java 8 nicht zu gelten, da ich auf meinem Linux-64-Bit-System mit einem Gesamtspeicher von 6 GB standardmäßig ein JVM mit -Xmx = 1,5 GB habe.
Antworten:
Dies hängt von der Implementierung und Version ab, hängt jedoch normalerweise von der verwendeten VM (z. B. Client oder Server, siehe -client
und -server
Parameter) und Ihrem Systemspeicher ab.
Oft für client
den Standardwert ist 1 / 4. Ihren physischen Speicher oder 1 GB (je nachdem , was kleiner ist).
Auch Java-Konfigurationsoptionen (Befehlszeilenparameter) können an Umgebungsvariablen einschließlich der "ausgelagert" werden -Xmx
, die den Standard ändern können (dh einen neuen Standard angeben). Insbesondere wird die JAVA_TOOL_OPTIONS
Umgebungsvariable von allen Java-Tools überprüft und verwendet, falls vorhanden (weitere Details hier und hier ).
Sie können den folgenden Befehl ausführen, um Standardwerte anzuzeigen:
java -XX:+PrintFlagsFinal -version
Es gibt Ihnen eine 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.
java -XX:+PrintCommandLineFlags
die von der JVM ausgewählten Heap-Größen (und andere Informationen) basierend auf den aktuellen Systeminformationen ausdrucken
-XX:+PrintFlagsFinal
, der von Ihnen vorgeschlagene funktioniert bei mir nicht. Hinzufügen zur Antwort.
-XX:+PrintFlagsFinal
ist die beste Option, da alle Informationen angezeigt werden sollten, nachdem alles berücksichtigt wurde (einschließlich manueller Optionen und Ergonomie). Obwohl -XX:+PrintCommandLineFlags
scheint auf meiner JVM zu funktionieren (kann von der genauen Version abhängen)
java -XX:+PrintFlagsFinal -version | grep HeapSize
Wie Sie bereits erwähnt haben, -Xmxsize
hängt die Standardeinstellung (Maximum HeapSize) von Ihrer Systemkonfiguration ab.
Java8 client
benötigt mehr als 1/64 Ihres physischen Speichers für Ihre Xmssize
(minimale HeapSize) und kleinere von 1/4 Ihres physischen Speichers für Ihre -Xmxsize
(maximale HeapSize).
Das heißt, wenn Sie einen physischen Speicher von 8 GB RAM haben, haben Sie einen Xmssize
größeren von 8 * (1/6) und einen kleineren von -Xmxsize
8 * (1/4).
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 den gewünschten Betrag überschrieben werden.
Überraschenderweise hat diese Frage keine endgültige dokumentierte Antwort. Vielleicht würde ein anderer Datenpunkt anderen, die nach einer Antwort suchen, einen Wert bieten. 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, nicht auf 1 GB beschränkt.
Auch -XX:+PrintFlagsFinal
druckt auf STDERR so Befehl aktuellen Standardspeicher von anderen präsentiert , um zu bestimmen oben sollte auf die folgenden gezwickt werden:
java -XX:+PrintFlagsFinal 2>&1 | grep MaxHeapSize
Folgendes wird auf einem System mit 64 GB physischem RAM zurückgegeben:
uintx MaxHeapSize := 16873684992 {product}
Auf meiner Ubuntu-VM mit 1048 MB Gesamt-RAM java -XX:+PrintFlagsFinal -version | grep HeapSize
gedruckt uintx MaxHeapSize := 266338304
:, was ca. 266 MB entspricht und 1/4 meines gesamten RAM beträgt.
Stand: 8. Mai 2019:
Die Größe des JVM-Heapspeichers hängt von der Systemkonfiguration ab. Dies bedeutet:
a) Client-JVM gegen Server-JVM
b) 32 Bit gegen 64 Bit .
Links:
1) Aktualisierung von J2SE5.0: https://docs.oracle.com/javase/6/docs/technotes/guides/vm/gc-ergonomics.html
2) kurze Antwort: https://docs.oracle.com/ javase / 8 / docs / technotes / guide / vm / gctuning / ergonomics.html
3) detaillierte Antwort: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html# default_heap_size
4) Client gegen Server: https://www.javacodegeeks.com/2011/07/jvm-options-client-vs-server.html
Zusammenfassung: (Es ist schwer von den obigen Links zu verstehen. Fassen Sie sie hier zusammen.)
1) Die standardmäßige maximale Heap-Größe für Client-JVM beträgt 256 MB (es gibt eine Ausnahme, die über die obigen Links gelesen wird).
2) Die standardmäßige maximale Heap-Größe für Server-JVM von 32 Bit beträgt 1 GB und von 64 Bit 32 GB (auch hier gibt es Ausnahmen. Bitte lesen Sie dies aus den Links).
Die maximale Größe des JVM- Heapspeichers beträgt also: 256 MB oder 1 GB oder 32 GB, abhängig von der obigen VM.