Wenn ich die -Xmxn
Option in der Java-Befehlszeile weglasse, wird ein Standardwert verwendet. Laut Java-Dokumentation
"Der Standardwert wird zur Laufzeit basierend auf der Systemkonfiguration ausgewählt."
Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?
java
heap
heap-memory
Richard Dorman
quelle
quelle
Antworten:
Unter Windows können Sie den folgenden Befehl verwenden, um die Standardeinstellungen auf dem System zu ermitteln, auf dem Ihre Anwendungen ausgeführt werden.
Suchen Sie nach den Optionen
MaxHeapSize
(für-Xmx
) undInitialHeapSize
für-Xms
.Auf einem Unix / Linux-System können Sie dies tun
Ich glaube, die resultierende Ausgabe ist in Bytes.
quelle
InitialHeapSize = 262803264
undMaxHeapSize = 4206886912
das sind ungefähr 256 MB und 4 GB, wenn ich mich nicht irre. Bedeutet dies, dass jede JVM so startet, als ob sie mit-Xms256m -Xmx4g
Optionen gestartet worden wäre ?java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
-version
der lange "Verwendungs" -Text unterdrücktstderr
.Für Java SE 5: Laut Garbage Collector Ergonomics [Oracle] :
AKTUALISIEREN:
Wie Tom Anderson in seinem Kommentar hervorhob, gilt dies für Maschinen der Serverklasse. Aus der Ergonomie in der 5.0 JavaTM Virtual Machine :
quelle
8 Java braucht mehr als 1 / 64th Ihren physischen Speicher für Ihren Xmssize (Minimum HeapSize) und weniger als 1 / 4. Ihren physischen Speichers für Ihr -Xmxsize (Maximum HeapSize).
Sie können die Standardgröße des Java-Heapspeichers überprüfen, indem Sie:
In Windows :
Unter Linux :
Der physische Speicher des Computers und die Java-Version.
quelle
Dies wird in Java 6 Update 18 geändert .
Angenommen, wir haben mehr als 1 GB physischen Speicher (heutzutage üblich), dann ist es immer 1/4 Ihres physischen Speichers für die Server-VM.
quelle
greater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Ernesto hat recht. Laut dem Link, den er gepostet hat [1]:
[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html
quelle
Für die IBM JVM lautet der Befehl wie folgt:
Weitere Informationen zum IBM SDK für Java 8 finden Sie unter http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.java.lnx.80.doc/diag/appendixes/defaults.html lang = en
quelle
Schließlich!
Ab Java 8u191 haben Sie jetzt folgende Möglichkeiten:
Dies kann verwendet werden, um den Heap als Prozentsatz des verwendbaren physischen RAM zu dimensionieren. (Dies entspricht dem RAM, der weniger installiert ist, als der Kernel verwendet).
Siehe Release Notes für Java8 U191 für weitere Informationen. Beachten Sie, dass die Optionen unter einer Docker-Überschrift aufgeführt sind. Sie gelten jedoch unabhängig davon, ob Sie sich in einer Docker-Umgebung oder in einer herkömmlichen Umgebung befinden.
Der Standardwert für
MaxRAMPercentage
ist 25%. Das ist äußerst konservativ.Meine eigene Regel: Wenn Ihr Host mehr oder weniger der Ausführung der angegebenen Java-Anwendung gewidmet ist, können Sie ohne Probleme dramatisch zunehmen. Wenn Sie unter Linux arbeiten, nur Standard-Daemons ausführen und RAM von etwa 1 GB und mehr installiert haben, würde ich ohne zu zögern 75% für den Heap der JVM verwenden. Denken Sie auch hier daran, dass 75% des verfügbaren Arbeitsspeichers und nicht der installierte Arbeitsspeicher vorhanden sind . Was bleibt, sind die anderen Benutzerlandprozesse, die möglicherweise auf dem Host ausgeführt werden, und die anderen Speichertypen, die die JVM benötigt (z. B. für den Stapel). Alles in allem passt dies normalerweise gut zu den verbleibenden 25%. Mit noch mehr installiertem RAM sind die 75% natürlich eine sicherere und sicherere Wette. (Ich wünschte, die JDK-Leute hätten eine Option implementiert, bei der Sie eine Leiter angeben könnten.)
Das Einstellen der
MaxRAMPercentage
Option sieht folgendermaßen aus:Beachten Sie, dass diese Prozentwerte vom Typ 'double' sind und Sie sie daher mit einem Dezimalpunkt angeben müssen . Sie erhalten einen etwas merkwürdigen Fehler, wenn Sie "75" anstelle von "75.0" verwenden.
quelle
Werfen Sie einen Blick in die Dokumentation Seite
Client JVM Standard anfängliche und maximale Heap-Größen:
Die standardmäßige maximale Heap-Größe beträgt die Hälfte des physischen Speichers bis zu einer physischen Speichergröße von 192 Megabyte (MB) und ansonsten ein Viertel des physischen Speichers bis zu einer physischen Speichergröße von 1 Gigabyte (GB) .
Standardmäßige und maximale Heap-Größe der Server-JVM:
Bei 32-Bit-JVMs kann die standardmäßige maximale Heap-Größe bis zu 1 GB betragen, wenn 4 GB oder mehr physischer Speicher vorhanden sind . Bei 64-Bit-JVMs kann die standardmäßige maximale Heap-Größe bis zu 32 GB betragen, wenn 128 GB oder mehr physischer Speicher vorhanden sind
Sie können die anfängliche und maximale Heap-Größe mit den Flags -Xms (anfängliche Heap-Größe) und -Xmx (maximale Heap-Größe) angeben . Wenn Sie wissen, wie viel Heap Ihre Anwendung benötigt, um gut zu funktionieren, können Sie -Xms und -Xmx auf denselben Wert setzen
quelle
Das
Xms
undXmx
sind Flag der Java Virtual Machine (JVM):Xms
:initial and minimum
JVMheap size
Format
::-Xmx<size>[g|G|m|M|k|K]
Default Size
::-server
Modus: 25% des freien physischen Speichers,> = 8 MB und <= 64 MB-client mode
: 25% des freien physischen Speichers,> = 8 MB und <= 16 MBTypical Size
::-Xms128M
-Xms256M
-Xms512M
Function
/Effect
:Xms
Zuweisen von SpeichergrößeXmx
:maximum
JVMheap size
Format
::-Xmx<size>[g|G|m|M|k|K]
Default Size
::<= R27.2
Windows
:75%
des gesamten physischen Gedächtnisses bis zu1GB
Linux/Solaris
:50%
des verfügbaren physischen Speichers bis zu1GB
>= R27.3
Windows X64
:75%
des gesamten physischen Gedächtnisses bis zu2GB
Linux/Solaris X64
:50%
des verfügbaren physischen Speichers bis zu2GB
Windows x86
:75%
des gesamten physischen Gedächtnisses bis zu1GB
Linux/Solaris X86
:50%
des verfügbaren physischen Speichers bis zu1GB
Typical Size
::-Xmx1g
-Xmx2084M
-Xmx4g
-Xmx6g
-Xmx8g
Function
/Effect
:Xmx
Speicher mit maximaler GrößeXmx
, wirdjava.lang.OutOfMemoryError
OutOfMemoryError
?Xmx
Wert überschreiten-Xmx4g
bis-Xmx8g
Mehr Details
Siehe offizielles Dokument: -X Befehlszeilenoptionen
quelle
Eine Reihe von Parametern beeinflusst die Generierungsgröße. Das folgende Diagramm zeigt den Unterschied zwischen festgeschriebenem Speicherplatz und virtuellem Speicherplatz im Heap. Bei der Initialisierung der virtuellen Maschine wird der gesamte Speicherplatz für den Heap reserviert. Die Größe des reservierten Speicherplatzes kann mit der
-Xmx
Option angegeben werden. Wenn der Wert des-Xms
Parameters kleiner als der Wert des-Xmx
Parameters ist, wird nicht der gesamte reservierte Speicherplatz sofort an die virtuelle Maschine übergeben. Der nicht festgeschriebene Speicherplatz ist in dieser Abbildung als "virtuell" gekennzeichnet. Die verschiedenen Teile des Haufens (permanente Generation, feste Generation und junge Generation) können bei Bedarf bis an die Grenze des virtuellen Raums wachsen.Standardmäßig vergrößert oder verkleinert die virtuelle Maschine den Heap bei jeder Sammlung, um zu versuchen, den Anteil des freien Speicherplatzes an lebenden Objekten in jeder Sammlung innerhalb eines bestimmten Bereichs zu halten. Dieser Zielbereich wird durch die Parameter -
XX:MinHeapFreeRatio=<minimum>
und als Prozentsatz festgelegt-XX:MaxHeapFreeRatio=<maximum>
, und die Gesamtgröße wird unten durch-Xms<min>
und über begrenzt-Xmx<max>
.Parameter Standardwert
MinHeapFreeRatio 40
MaxHeapFreeRatio 70
-Xms 3670k
-Xmx 64m
Die Standardwerte der Heap-Größenparameter auf 64-Bit-Systemen wurden um ca. 30% erhöht. Diese Erhöhung soll die größere Größe von Objekten auf einem 64-Bit-System ausgleichen.
Wenn mit diesen Parametern der Prozentsatz des freien Speicherplatzes in einer Generation unter 40% fällt, wird die Generation erweitert, um 40% freien Speicherplatz bis zur maximal zulässigen Größe der Generation beizubehalten. Wenn der freie Speicherplatz 70% überschreitet, wird die Generation in ähnlicher Weise kontrahiert, sodass nur 70% des Speicherplatzes frei sind, vorbehaltlich der Mindestgröße der Generation.
Bei großen Serveranwendungen treten bei diesen Standardeinstellungen häufig zwei Probleme auf. Eine davon ist der langsame Start, da der anfängliche Heap klein ist und die Größe vieler wichtiger Sammlungen geändert werden muss. Ein dringenderes Problem ist, dass die standardmäßige maximale Heap-Größe für die meisten Serveranwendungen unangemessen klein ist. Die Faustregeln für Serveranwendungen lauten:
Erhöhen Sie im Allgemeinen den Speicher, wenn Sie die Anzahl der Prozessoren erhöhen, da die Zuordnung parallelisiert werden kann.
Es gibt den vollständigen Artikel
quelle