Anleitung zu den wichtigsten JVM-Parametern

Leitfaden zu den wichtigsten JVM-Parametern

1. Überblick

In diesem kurzen Tutorial werden die bekanntesten Optionen erläutert, mit denen die Java Virtual Machine konfiguriert werden kann.

2. Expliziter Heapspeicher - Xms- und Xmx-Optionen

Eine der am häufigsten angewendeten Methoden im Zusammenhang mit der Leistung ist die Initialisierung des Heapspeichers gemäß den Anwendungsanforderungen.

Aus diesem Grund sollten wir die minimale und maximale Heap-Größe angeben. Die folgenden Parameter können verwendet werden, um dies zu erreichen:

-Xms[unit]
-Xmx[unit]

Hier bezeichnetunit die Einheit, in der der Speicher (angezeigt durchheap size) initialisiert werden soll. Einheiten können als‘g' für GB,‘m' für MB und‘k' für KB markiert werden.

Wenn wir beispielsweise JVM mindestens 2 GB und höchstens 5 GB zuweisen möchten, müssen Sie Folgendes schreiben:

-Xms2G -Xmx5G

Ab Java 8 ist die Größe vonMetaspace nicht definiert. Sobald das globale Limit erreicht ist, erhöht JVM es automatisch. Um jedoch unnötige Instabilitäten zu überwinden, können wir die Größe vonMetaspacewie folgt festlegen:

-XX:MaxMetaspaceSize=[unit]

Hier bezeichnetmetaspace size die Speichermenge, die wirMetaspace zuweisen möchten.

NachOracle guidelines ist nach dem insgesamt verfügbaren Speicher der zweiteinflussreichste Faktor der Anteil des für die junge Generation reservierten Haufens. Standardmäßig beträgt die minimale Größe des YG 1310MB und die maximale Größeunlimited.

Wir können sie explizit zuweisen:

-XX:NewSize=[unit]
-XX:MaxNewSize=[unit]

3. Speicherbereinigung

Für eine bessere Stabilität der Anwendung ist die Auswahl des richtigenGarbage Collection-Algorithmus entscheidend.

JVM verfügt über vier Arten vonGC-Implementierungen:

  • Serienmüllsammler

  • Paralleler Garbage Collector

  • CMS Garbage Collector

  • G1 Müllsammler

Diese Implementierungen können mit den folgenden Parametern deklariert werden:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

Weitere Details zuGarbage Collection Implementierungen finden Sie unterhere.

4. GC-Protokollierung

Um den Anwendungszustand genau zu überwachen, sollten wir immer dieGarbage Collection-Leistung der JVM überprüfen. Der einfachste Weg, dies zu tun, besteht darin, die Aktivität vonGCin einem für Menschen lesbaren Format zu protokollieren.

Mit den folgenden Parametern können wir die Aktivität vonGCprotokollieren:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotation gibt die fortlaufende Richtlinie für Protokolldateien an, ähnlich wie log4j, s4lj usw. NumberOfGCLogFiles bezeichnet die maximale Anzahl von Protokolldateien, die für einen einzelnen Anwendungslebenszyklus geschrieben werden können. GCLogFileSize gibt die maximale Größe der Datei an. Schließlich bezeichnetloggc seine Position.

Hierbei ist zu beachten, dass zwei weitere JVM-Parameter verfügbar sind (-XX:+PrintGCTimeStamps und-XX:+PrintGCDateStamps), mit denen der datumsbezogene Zeitstempel imGC-Protokoll gedruckt werden kann.

Wenn Sie beispielsweise maximal 100GCProtokolldateien mit einer maximalen Größe von jeweils 50 MB zuweisen und diese an der Position von/home/user/log/'peichern möchten, können Sie die folgende Syntax verwenden:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

Das Problem ist jedoch, dass immer ein zusätzlicher Daemon-Thread zur Überwachung der Systemzeit im Hintergrund verwendet wird. Dieses Verhalten kann zu einem Leistungsengpass führen. Deshalb ist es immer besser, in der Produktion nicht mit diesem Parameter zu spielen.

5. Umgang mit nicht genügend Speicher

Es ist sehr häufig, dass eine große Anwendungout of memory error ausgesetzt ist, was wiederum zum Absturz der Anwendung führt. Es ist ein sehr kritisches Szenario und sehr schwer zu replizieren, um das Problem zu beheben.

Aus diesem Grund enthält JVM einige Parameter, die den Heapspeicher in eine physische Datei speichern, die später zum Auffinden von Lecks verwendet werden kann:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

Ein paar Punkte, die Sie hier beachten sollten:

  • HeapDumpOnOutOfMemoryError weist die JVM an, im Fall vonOutOfMemoryError den Heap in eine physische Datei zu kopieren

  • HeapDumpPath bezeichnet den Pfad, in den die Datei geschrieben werden soll; Jeder Dateiname kann angegeben werden. Wenn JVM jedoch ein<pid>-Tag im Namen findet, wird die Prozess-ID des aktuellen Prozesses, der den Speicherfehler verursacht, an den Dateinamen im.hprof-Format angehängt

  • OnOutOfMemoryError wird verwendet, um Notfallbefehle auszugeben, die bei einem Speicherfehler ausgeführt werden sollen. Der richtige Befehl sollte im Raum von cmd args verwendet werden. Wenn wir zum Beispiel den Server neu starten möchten, sobald nicht genügend Speicher vorhanden ist, können wir den Parameter festlegen:

-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit ist eine Richtlinie, die den Anteil der VM-Zeit begrenzt, die im GC verbracht wird, bevor einOutOfMemory-Fehler ausgelöst wird

6. 32/64 Bit

In der Betriebssystemumgebung, in der sowohl 32-Bit- als auch 64-Bit-Pakete installiert sind, wählt die JVM automatisch 32-Bit-Umgebungspakete aus.

Wenn wir die Umgebung manuell auf 64 Bit einstellen möchten, können wir dies mit dem folgenden Parameter tun:

-d

OS-bit kann entweder32 oder64 sein. Weitere Informationen hierzu finden Sie unterhere.

7. Misc

  • -server: Aktiviert "Server Hotspot VM"; Dieser Parameter wird standardmäßig in 64-Bit-JVM verwendet

  • -XX:+UseStringDeduplication:Java 8u20 hat diesen JVM-Parameter eingeführt, um die unnötige Speichernutzung zu reduzieren, indem zu viele Instanzen desselbenString; erstellt werden. Dadurch wird der Heapspeicher optimiert, indem doppelteString-Werte reduziert werden zu einem einzelnen globalen char [] Array

  • -XX:+UseLWPSynchronization: Legt dieLWP (Light Weight Process) -basierte Synchronisationsrichtlinie anstelle der threadbasierten Synchronisation fest

  • -XX:LargePageSizeInBytes: legt die große Seitengröße fest, die für den Java-Heap verwendet wird. es nimmt das Argument in GB / MB / KB; Bei größeren Seiten können wir die Hardwareressourcen des virtuellen Speichers besser nutzen. Dies kann jedoch zu größeren Speicherplatzgrößen fürPermGen führen, was wiederum dazu führen kann, dass der Java-Heapspeicherplatz verkleinert wird

  • -XX:MaxHeapFreeRatio: Legt den maximalen Prozentsatz an freiem Heap nachGC fest, um ein Schrumpfen zu vermeiden.

  • -XX:MinHeapFreeRatio: Legt den Mindestprozentsatz an freiem Heap nachGC fest, um eine Erweiterung zu vermeiden. Zur Überwachung der Heap-Nutzung können SieVisualVM verwenden, die mit JDK geliefert werden.

  • -XX:SurvivorRatio: Verhältnis voneden /survivor space size - zum Beispiel setzt-XX:SurvivorRatio=6 das Verhältnis zwischen jedemsurvivor space undeden space auf 1: 6,

  • -XX:+UseLargePages: Verwenden Sie einen großen Seitenspeicher, wenn dieser vom System unterstützt wird. Bitte beachten Sie, dassOpenJDK 7 bei Verwendung dieses JVM-Parameters zum Absturz neigt **

  • -XX:+UseStringCache: ermöglicht das Zwischenspeichern häufig zugewiesener Zeichenfolgen, die im Pool vonString verfügbar sind **

  • -XX:+UseCompressedStrings: Verwenden Sie einenbyte[]-Typ fürString-Objekte, die im reinen ASCII-Format dargestellt werden können

  • -XX:+OptimizeStringConcat: optimiert nach Möglichkeit die Verkettungsoperationen vonString**

8. Fazit

In diesem kurzen Artikel haben wir einige wichtige JVM-Parameter kennengelernt, mit denen die allgemeine Anwendungsleistung optimiert und verbessert werden kann.

Einige davon können auch zu Debugging-Zwecken verwendet werden.

Wenn Sie die Referenzparameter genauer untersuchen möchten, können Sie mithere beginnen.