556 Stimmen

Wie wird die standardmäßige maximale Java-Heap-Größe bestimmt?

Wenn ich das -Xmx_**n**_ Option in der Java-Befehlszeile eingeben, wird ein Standardwert verwendet. Gemäß Java-Dokumentation

"der Standardwert wird zur Laufzeit auf der Grundlage der Systemkonfiguration ausgewählt"

Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?

657voto

stones333 Punkte 8068

Unter Windows können Sie den folgenden Befehl verwenden, um die Standardeinstellungen auf dem System herauszufinden, auf dem Ihre Anwendungen laufen.

java -XX:+PrintFlagsFinal -version | findstr HeapSize

Suchen Sie nach den Optionen MaxHeapSize (für -Xmx ) und InitialHeapSize para -Xms .

Auf einem Unix/Linux-System können Sie Folgendes tun

java -XX:+PrintFlagsFinal -version | grep HeapSize

Ich glaube, die Ausgabe erfolgt in Bytes.

130voto

dogbane Punkte 253146

Für Java SE 5: Nach Ergonomie des Garbage Collectors [Oracle] :

anfängliche Heap-Größe:

Größer als 1/64 des physischen Arbeitsspeichers des Rechners oder einige vernünftiges Minimum. Vor J2SE 5.0, war die standardmäßige anfängliche Heapgröße ein vernünftiges Minimum, das je nach Plattform. Sie können diese Vorgabe mit der Befehlszeilenoption -Xms Option überschreiben.

maximale Heap-Größe:

Kleiner als 1/4 des physischen Speichers oder 1 GB. Vor J2SE 5.0 war der standardmäßig eine maximale Heapgröße von 64 MB. Sie können diese Vorgabe mit der der Befehlszeilenoption -Xmx überschreiben.

UPDATE:

Wie Tom Anderson in seinem Kommentar anmerkt, gelten die obigen Angaben für Maschinen der Serverklasse. Von Ergonomie in der virtuellen Maschine JavaTM 5.0 :

In der J2SE-Plattform Version 5.0 wird eine Klasse von Maschinen, die als Server-Klasse bezeichnete Maschinenklasse definiert worden als eine Maschine mit

  • 2 oder mehr physische Prozessoren
  • 2 oder mehr Gbyte physischer Speicher

mit Ausnahme von 32-Bit-Plattformen auf denen eine Version des Windows Betriebssystems. Auf allen anderen Plattformen sind die Standardwerte die die gleichen wie die Standardwerte für die Version 1.4.2.

In der J2SE-Plattform Version 1.4.2 wurden standardmäßig Standardmäßig wurden die folgenden Einstellungen vorgenommen gemacht

  • anfängliche Heap-Größe von 4 Mbyte
  • maximale Heap-Größe von 64 Mbyte

82voto

Sarat Chandra Punkte 4840

Java 8 benötigt mehr als 1/64. Ihres physischen Speichers für Ihr Xmssize (Minimum HeapSize) und weniger als 1/4. Ihres physischen Speichers für Ihr -Xmxsize (Maximale HeapSize).

Sie können die Standard-Java-Heap-Größe von:

Unter Windows :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Unter Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?

Die Maschine Physischer Speicher und Java-Version.

43voto

ernesto Punkte 1779

Dies wird geändert in Java 6 Aktualisierung 18 .

Angenommen, wir haben mehr als 1 GB des physischen Arbeitsspeichers (heutzutage üblich), ist es immer 1/4 des physischen Speichers für die Server-VM.

40voto

peterh Punkte 16923

Endlich!

Ab Java 8u191 haben Sie nun die Möglichkeit dazu:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

die verwendet werden kann, um die Größe des Heaps als Prozentsatz des nutzbaren physischen RAM zu bestimmen. (der dem installierten RAM abzüglich des vom Kernel verwendeten entspricht).

参照 Versionshinweise für Java8 u191 für weitere Informationen. Beachten Sie, dass die Optionen unter einer Docker-Überschrift erwähnt werden, aber tatsächlich gelten sie sowohl in einer Docker-Umgebung als auch in einer herkömmlichen Umgebung.

Der Standardwert für MaxRAMPercentage beträgt 25%. Dies ist äußerst konservativ.

Meine eigene Regel: Wenn Ihr Host mehr oder weniger auf die Ausführung der gegebenen Java-Anwendung ausgerichtet ist, dann können Sie ohne Probleme drastisch erhöhen. Wenn Sie Linux verwenden, nur Standard-Daemons laufen lassen und RAM von etwa 1 GB aufwärts installiert haben, würde ich nicht zögern, 75% für den Heap der JVM zu verwenden. Nochmals: Denken Sie daran, dass dies 75% des RAMs sind. verfügbar nicht der RAM installiert . Was übrig bleibt, sind die anderen Benutzerlandprozesse, die auf dem Host laufen können, und die anderen Arten von Speicher, die die JVM benötigt (z. B. für den Stack). Alles zusammen passt in der Regel gut in die verbleibenden 25 %. Mit noch mehr installiertem RAM sind die 75 % natürlich eine immer sicherere Wette. (Ich wünschte, die JDK-Leute hätten eine Option implementiert, mit der man eine Leiter angeben kann)

Einstellung der MaxRAMPercentage Die Option sieht folgendermaßen aus:

java -XX:MaxRAMPercentage=75.0  ....

Beachten Sie, dass diese Prozentwerte vom Typ "double" sind und Sie daher debe sie mit einem Dezimalpunkt angeben. Sie erhalten eine etwas seltsame Fehlermeldung, wenn Sie "75" anstelle von "75.0" verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X