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

418

Wenn ich die -XmxnOption 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?

Richard Dorman
quelle
1
Systemkonfiguration bedeutet: a) Client-JVM gegen Server-JVM b) 32-Bit gegen 64-Bit. Links: 1) Aktualisierung von J2SE5.0 docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) kurze Antwort: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) detaillierte Antwort: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) Client gegen Server: javacodegeeks.com/2011/07/jvm-options-client- vs-server.html
Vyshnav Ramesh Thrissur
2
Es ist schwer von den obigen Links zu verstehen. Fassen Sie sie hier zusammen: Die maximale Heap-Größe für Client-JVM beträgt 256 MB (es gibt eine Ausnahme, lesen Sie über die obigen Links). Die maximale Heap-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). Also seine 256 MB oder 1 GB oder 32 GB
Vyshnav Ramesh Thrissur
Siehe auch stackoverflow.com/a/56036202/32453
rogerdpack

Antworten:

504

Unter Windows können Sie den folgenden Befehl verwenden, um die Standardeinstellungen auf dem System zu ermitteln, auf dem Ihre Anwendungen ausgeführt werden.

java -XX: + PrintFlagsFinal -version | findstr HeapSize

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

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

java -XX: + PrintFlagsFinal -version | grep HeapSize

Ich glaube, die resultierende Ausgabe ist in Bytes.

Steine333
quelle
3
Ich hatte auf eine nette Option wie diese gehofft, aber sie funktionierte bei Verwendung der Java 6 VM von IBM nicht.
Matt Lavin
Großartig! Kann ich mit all diesen Standardoptionen spielen? Was ist die entsprechende ENV-Variable für jede?
Elist
28
In meinem Fall unter Linux, InitialHeapSize = 262803264und MaxHeapSize = 4206886912das 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 -Xmx4gOptionen gestartet worden wäre ?
Yuriy Nakonechnyy
9
Auf einem Windows-System:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m
1
@matanster Unter meinem Linux wird -versionder lange "Verwendungs" -Text unterdrückt stderr.
Franklin Yu
115

Für Java SE 5: Laut Garbage Collector Ergonomics [Oracle] :

anfängliche Heap-Größe:

Größer als 1/64 des physischen Speichers der Maschine auf der Maschine oder ein vernünftiges Minimum. Vor J2SE 5.0 war die anfängliche Standard-Heap-Größe ein angemessenes Minimum, das je nach Plattform variiert. Sie können diese Standardeinstellung mit der Befehlszeilenoption -Xms überschreiben.

maximale Heap-Größe:

Kleiner als 1/4 des physischen Speichers oder 1 GB. Vor J2SE 5.0 betrug die standardmäßige maximale Heap-Größe 64 MB. Sie können diese Standardeinstellung mit der Befehlszeilenoption -Xmx überschreiben.

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 :

In der J2SE-Plattformversion 5.0 wurde eine Maschinenklasse, die als Serverklassenmaschine bezeichnet wird, als Maschine mit definiert

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

mit Ausnahme von 32-Bit-Plattformen, auf denen eine Version des Windows-Betriebssystems ausgeführt wird. Auf allen anderen Plattformen entsprechen die Standardwerte den Standardwerten für Version 1.4.2.

In der J2SE-Plattformversion 1.4.2 wurden standardmäßig die folgenden Auswahlen getroffen

  • anfängliche Heap-Größe von 4 MB
  • maximale Heap-Größe von 64 MB
Dogbane
quelle
4
Vorsichtsmaßnahme: Dies gilt für Computer der Serverklasse, nicht für Clientklassen. Sie müssen dieses Dokument in Verbindung mit java.sun.com/docs/hotspot/gc5.0/ergo5.html lesen, in dem diese Begriffe definiert sind und was mit Computern der Clientklasse geschieht. dogbane, könnte ich demütig vorschlagen, dass Sie Ihre Antwort bearbeiten, um die relevanten Passagen zu zitieren?
Tom Anderson
3
Das ist ein lächerlich niedriger Standardwert im Jahr 2012. Nur sehr wenige ernsthafte Anwendungen passen in 64 Megabyte.
Mark E. Haase
1
Siehe Ernestos Antwort vom 30. Oktober 2012 für Client-Computer nach Java 6 Update 18.
Andy Thomas
Beachten Sie auch, dass darin steht: "Die für die Heap-Größe angegebenen Grenzen und Brüche sind für J2SE 5.0 korrekt. Sie werden in späteren Versionen wahrscheinlich anders sein, wenn Computer leistungsfähiger werden."
Lodovik
Dieses Algo ist übrigens nur für Parallel Garbage Collector.
Mike Argyriou
45

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 :

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?

Der physische Speicher des Computers und die Java-Version.

Sarat Chandra
quelle
5
ist es nicht 1/64 statt 1/6?
Vyshnav Ramesh Thrissur
1
Ja, Xmssize (Minimum HeapSize / InitialHeapSize) macht mehr als 1/64 Ihres physischen Speichers aus und Xmxsize (Maximum HeapSize / MaxHeapSize) macht weniger als 1/4 Ihres physischen Speichers aus. (Zum Beispiel für meinen Mac mit 16 GB RAM erhalte ich uintx InitialHeapSize: = 268435456 {Produkt} uintx MaxHeapSize: = 4294967296 {Produkt}, i, e Xms ist 268 MB & Xmx ist 4,29 GB
sjethvani
1
Bitte bearbeiten Sie die Antwort. Es ist 1/64, nicht 1/6.
Smaragdhieu
35

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.

ernesto
quelle
8
Falsch, die verlinkte Seite sagtgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni
5
Ich habe gerade auf einem Linux-Computer mit 5 GB physischem Speicher nachgesehen. Standardmäßig wird der maximale Heap als 1,5
GB
1
@PaoloFulgoni nein, ein weiteres praktisches Beispiel, das ich gerade beobachte: 129 GB physischer Speicher ergeben 32 GB maximale Heap-Größe
Kirill
Siehe apls Antwort, warum dies richtig ist: stackoverflow.com/a/13310792/32453 Siehe auch stackoverflow.com/a/56036202/32453
rogerdpack
16

Ernesto hat recht. Laut dem Link, den er gepostet hat [1]:

Aktualisierte Client-JVM-Heap-Konfiguration

In der Client-JVM ...

  • Die standardmäßige maximale Heap-Größe beträgt die Hälfte des physischen Speichers bis zu einer physischen Speichergröße von 192 Megabyte und ansonsten ein Viertel des physischen Speichers bis zu einer physischen Speichergröße von 1 Gigabyte.

    Wenn Ihr Computer beispielsweise über 128 Megabyte physischen Speicher verfügt, beträgt die maximale Heap-Größe 64 Megabyte, und ein physischer Speicher von mindestens 1 Gigabyte führt zu einer maximalen Heap-Größe von 256 Megabyte.

  • Die maximale Heap-Größe wird von der JVM nur verwendet, wenn Ihr Programm genügend Objekte erstellt, um sie zu benötigen. Während der JVM-Initialisierung wird ein viel kleinerer Betrag zugewiesen, der als anfängliche Heap-Größe bezeichnet wird. ...

  • ...
  • Server JVM heap Konfiguration Ergonomie ist nun gleich das Client , außer dass die maximale Standardspeichergröße für die 32-Bit - JVMs 1 Gigabyte ist , entsprechend eine physikalische Speichergröße von 4 Gigabyte, und für 64-Bit - JVMs 32 Gigabytes , entsprechen auf eine physische Speichergröße von 128 Gigabyte.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html

apl
quelle
8

Schließlich!

Ab Java 8u191 haben Sie jetzt folgende Möglichkeiten:

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

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 MaxRAMPercentageist 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 MaxRAMPercentageOption sieht folgendermaßen aus:

java -XX:MaxRAMPercentage=75.0  ....

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.

Peterh
quelle
7

Der Standardwert wird zur Laufzeit basierend auf der Systemkonfiguration ausgewählt

Werfen Sie einen Blick in die Dokumentation Seite

Standard-Heap-Größe

Sofern die anfängliche und die maximale Heap-Größe nicht in der Befehlszeile angegeben sind, werden sie basierend auf der Speichermenge auf dem Computer berechnet.

  1. 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) .

  2. 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

Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?

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

Ravindra Babu
quelle
5

Das Xmsund Xmxsind Flag der Java Virtual Machine (JVM):

  • Xms: initial and minimumJVMheap 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 MB
    • Typical Size::
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/ Effect:
      • -> JVM beginnt mit dem XmsZuweisen von Speichergröße
  • Xmx: maximumJVMheap 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:
      • -> JVM erlaubt die Verwendung von XmxSpeicher mit maximaler Größe
        • wenn überschreiten Xmx, wirdjava.lang.OutOfMemoryError
          • Wie zu beheben OutOfMemoryError?
            • XmxWert überschreiten
              • zB: von -Xmx4gbis-Xmx8g

Mehr Details

Siehe offizielles Dokument: -X Befehlszeilenoptionen

Crifan
quelle
Ist das nicht für die JRockit JVM? (im Gegensatz zu Oracle Hotspot JVM)
Peterh
4

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 -XmxOption angegeben werden. Wenn der Wert des -XmsParameters kleiner als der Wert des -XmxParameters 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.

Geben Sie hier die Bildbeschreibung ein

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:

  • Versuchen Sie, der virtuellen Maschine so viel Speicher wie möglich zuzuweisen, es sei denn, Sie haben Probleme mit Pausen. Die Standardgröße (64 MB) ist häufig zu klein.
  • Wenn Sie -Xms und -Xmx auf denselben Wert setzen, wird die Vorhersagbarkeit erhöht, indem die wichtigste Größenentscheidung aus der virtuellen Maschine entfernt wird. Die virtuelle Maschine kann dies jedoch nicht kompensieren, wenn Sie eine schlechte Wahl treffen.
  • 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

Theodor
quelle