it-swarm.com.de

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

Wenn ich die Option -Xmxn in der Befehlszeile Java weglasse, wird ein Standardwert verwendet. Laut Java-Dokumentation

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

Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?

378
Richard Dorman

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 InitialHeapSize fü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.

468
stones333

Laut Garbage Collector Ergonomics [Oracle] :

Anfangsgröße des Heapspeichers:

Größer als 1/64 des physischen Arbeitsspeichers der Maschine oder ein angemessenes Minimum. Vor J2SE 5.0 war die Standardgröße des anfänglichen Heapspeichers 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 war die maximale Standardgröße des Heapspeichers 64 MB. Sie können diese Standardeinstellung mit der Befehlszeilenoption -Xmx überschreiben.

UPDATE:

Wie von Tom Anderson in seinem Kommentar ausgeführt, gilt das Obige für Maschinen der Serverklasse. Von Ergonomie in der 5.0 JavaTM Virtual Machine :

In der J2SE-Plattformversion 5.0 wurde eine Klasse von Computern, die als Server-Klasse-Computer bezeichnet wird, als Computer mit definiert

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

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

In der J2SE-Plattformversion 1.4.2 wurden standardmäßig die folgenden Einstellungen vorgenommen

  • anfängliche Heap-Größe von 4 MB
  • maximale Heap-Größe von 64 MB
107
dogbane

Dies wurde in Java 6 Update 18 geändert.

Angenommen, wir haben mehr als 1 GB physischen Speicher (heutzutage üblich), dann ist dies immer 1/4 Ihres physischen Speichers.

30
ernesto

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

Sie können die Standard Java Heap-Größe folgendermaßen überprüfen:

In Windows:

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

In Linux:

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

Welche Systemkonfigurationseinstellungen beeinflussen den Standardwert?

Ihre physischer Speicher & Java Version.

20
Sarat Chandra

Ernesto hat recht. Laut dem von ihm geposteten Link [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 MB physischen Speicher verfügt, beträgt die maximale Größe des Heapspeichers 64 MB, und mindestens 1 GB physischen Speicher ergibt eine maximale Größe des Heapspeichers von 256 MB.

  • Die maximale Größe des Heapspeichers wird von der JVM nicht verwendet, es sei denn, Ihr Programm erstellt genügend Objekte, um dies zu erfordern. Während der JVM-Initialisierung wird eine viel kleinere Menge zugewiesen, die als anfängliche Heap-Größe bezeichnet wird. ...

  • ...
  • Die Ergonomie der Server-JVM-Heapkonfiguration entspricht nun der des Clients, mit der Ausnahme, dass die maximale Standard-Heapgröße für 32-Bit-JVMs 1 Gigabyte beträgt, was a entspricht Die physische Speichergröße beträgt 4 Gigabyte, und für 64-Bit-JVMs beträgt 32 Gigabyte , was einer physischen Speichergröße von 128 Gigabyte entspricht.

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

15
apl

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

Schauen Sie sich die Dokumentation an Seite

Standard-Heap-Größe

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

  1. Anfängliche und maximale Standard-Heap-Größe der Client-JVM:

    Die standardmäßige maximale Größe des Heapspeichers beträgt die Hälfte des physischen Speichers bis zu einer physischen Speichergröße von 192 MB und ansonsten ein Viertel des physischen Speichers bis zu einer physischen Speichergröße von 1 Gigabyte (GB) .

  2. Anfängliche und maximale Standard-Heap-Größe für Server-JVM:

    Auf 32-Bit-JVMs kann die maximale Standardgröße des Heapspeichers bis zu 1 GB betragen, wenn mindestens 4 GB physischer Speicher vorhanden sind . Auf 64-Bit-JVMs kann die maximale Standardgröße des Heapspeichers 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 die maximale Größe des Heapspeichers mithilfe der Flags - Xms (anfängliche Größe des Heapspeichers) und angeben - Xmx (maximale Heap-Größe). Wenn Sie wissen, wie viel Heap Ihre Anwendung benötigt, um gut zu funktionieren, können Sie - Xms und - Xmx auf den gleichen Wert

7
Ravindra babu

Für die IBM JVM lautet der Befehl wie folgt:

Java -verbose:sizes -version

Weitere Informationen zum IBM SDK für Java 8: http://www-01.ibm.com/support/knowledgecenter/SSYKE2_8.0.0/com.ibm.Java.lnx.80) .doc/diag/anhänge/defaults.html? lang = de

7
n0mer

Eine Reihe von Parametern wirkt sich auf die Generierungsgröße aus. Das folgende Diagramm zeigt den Unterschied zwischen dem festgeschriebenen Speicherplatz und dem virtuellen 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 Option -Xmx angegeben werden. Wenn der Wert des Parameters -Xms kleiner als der Wert des Parameters -Xmx ist, wird nicht der gesamte reservierte Speicherplatz sofort für die virtuelle Maschine festgeschrieben. Der nicht festgeschriebene Speicherplatz ist in dieser Abbildung als "virtuell" gekennzeichnet. Die verschiedenen Teile des Heaps (permanente Generation, feste Generation und junge Generation) können je nach Bedarf an die Grenze des virtuellen Raums wachsen.

enter image description here

Standardmäßig vergrößert oder verkleinert die virtuelle Maschine den Heap bei jeder Sammlung, um zu versuchen, den Anteil des freien Speicherplatzes für lebende Objekte bei jeder Sammlung innerhalb eines bestimmten Bereichs zu halten. Dieser Zielbereich wird als Prozentsatz durch die Parameter -XX:MinHeapFreeRatio=<minimum> und -XX:MaxHeapFreeRatio=<maximum> festgelegt, und die Gesamtgröße wird unten durch -Xms<min> und oben durch -Xmx<max> begrenzt.

Parameter Standardwert

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

Die Standardwerte der Parameter für die Größe des Heapspeichers 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 unter Vertrag genommen, so dass nur 70% des Speicherplatzes frei sind, vorbehaltlich der Mindestgröße der Generation.

Bei großen Serveranwendungen treten häufig zwei Probleme mit diesen Standardeinstellungen auf. Eine davon ist der langsame Start, da der anfängliche Heap klein ist und über viele wichtige Sammlungen hinweg geändert werden muss. Ein dringenderes Problem ist, dass die maximale Standardgröße des Heapspeichers für die meisten Serveranwendungen unangemessen klein ist. Die Faustregeln für Serveranwendungen sind:

  • 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.
  • Das Einstellen von -Xms und -Xmx auf denselben Wert erhöht die Vorhersagbarkeit, indem die wichtigste Größenentscheidung aus der virtuellen Maschine entfernt wird. Die virtuelle Maschine kann dies jedoch nicht ausgleichen, 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 das vollständiger Artikel

4
theodor

Die Xms und Xmx sind Kennzeichen der Java virtuellen Maschine (JVM):

  • Xms: initial and minimum JVM heap 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 der Zuweisung von Xms Speichergröße
  • Xmx: maximum JVM heap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75% des gesamten physischen Speichers bis zu 1GB
        • Linux/Solaris: 50% des verfügbaren physischen Speichers bis zu 1GB
      • >= R27.3
        • Windows X64: 75% des gesamten physischen Speichers bis zu 2GB
        • Linux/Solaris X64: 50% des verfügbaren physischen Speichers bis zu 2GB
        • Windows x86: 75% des gesamten physischen Speichers bis zu 1GB
        • Linux/Solaris X86: 50% des verfügbaren physischen Speichers bis zu 1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/Effect:
      • -> JVM erlaubt die Verwendung von maximal Xmx Speicherkapazität
        • wenn Xmx überschritten wird, Java.lang.OutOfMemoryError
          • Wie kann ich OutOfMemoryError reparieren?
            • Xmx Wert überschreiten
              • zB: von -Xmx4g zu -Xmx8g

Mehr Details

siehe offizielles Dokument: - X Befehlszeilenoptionen

3
crifan