Optimierung der Java-Anwendungsleistung

JavaBeginner
Jetzt üben

Einführung

JVM-Parameter dienen der Konfiguration der Java Virtual Machine (JVM), welche für die Ausführung von Java-Bytecode zuständig ist. Durch eine gezielte Konfiguration dieser Parameter können wir die Leistung von Java-Anwendungen verbessern. In diesem Lab lernen wir, wie man wichtige JVM-Parameter setzt, um die Performance von Java-Anwendungen zu optimieren.

Heap-Speicher konfigurieren

Der Heap-Speicher ist der Laufzeit-Datenbereich, in dem Java-Objekte allokiert werden. Wir können die Größe des Heap-Speichers mit den Parametern -Xmx und -Xms festlegen.

  • -Xmx<heap size>[unit]: legt die maximale Heap-Größe fest.
  • -Xms<heap size>[unit]: legt die initiale Heap-Größe fest.

Um beispielsweise die minimale Heap-Größe auf 512 MB und die maximale Heap-Größe auf 1 GB zu setzen, verwenden wir den folgenden Befehl:

java -Xms512m -Xmx1g MyApp

Garbage Collector auswählen

Die Garbage Collection ist der Prozess zur Freigabe von Speicher, der von Objekten belegt wird, die von der Java-Anwendung nicht mehr benötigt werden. Die Wahl des Garbage Collectors kann die Anwendungsleistung erheblich beeinflussen. Die JVM bietet verschiedene Garbage Collector, von denen jeder seine eigenen Stärken und Schwächen hat.

  • -XX:+UseSerialGC: aktiviert den Serial Garbage Collector, der einen einzelnen Thread für die Speicherbereinigung verwendet.
  • -XX:+UseParallelGC: aktiviert den Parallel Garbage Collector, der mehrere Threads für die Speicherbereinigung nutzt.
  • -XX:+UseParNewGC: aktiviert den Concurrent-Mark-Sweep (CMS) Garbage Collector, der mehrere Threads für eine parallele Speicherbereinigung einsetzt.
  • -XX:+UseG1GC: aktiviert den Garbage-First (G1) Garbage Collector, der auf konsistente Pausenzeiten und hohen Durchsatz ausgelegt ist.

Um beispielsweise den Parallel Garbage Collector zu aktivieren, verwenden wir den folgenden Befehl:

java -XX:+UseParallelGC MyApp

Garbage Collection Aktivitäten protokollieren

Das Logging der Garbage Collection ermöglicht es uns, die Leistung des Garbage Collectors zu überwachen und dessen Parameter basierend auf den Anforderungen der Anwendung anzupassen. Wir können die folgenden Parameter verwenden, um das Logging zu aktivieren:

  • -Xlog:gc*: aktiviert das Garbage-Collection-Logging in modernen Java-Versionen.
  • file=gc.log: schreibt die Log-Ausgabe in eine Datei namens gc.log.
  • filecount=10: behält bis zu 10 rotierte Log-Dateien bei.
  • filesize=10M: rotiert die Log-Datei, sobald sie 10 MB erreicht.

Um beispielsweise das Logging zu aktivieren und die Protokolle in gc.log zu speichern, verwenden wir den folgenden Befehl:

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M MyApp

Umgang mit Out-of-Memory-Fehlern

Wenn der JVM der Speicher ausgeht, wird ein Out-Of-Memory-Fehler ausgelöst. Wir können die folgenden JVM-Parameter verwenden, um diesen Fehler zu behandeln:

  • -XX:+HeapDumpOnOutOfMemoryError: bei Auftreten eines Out-Of-Memory-Fehlers schreibt die JVM einen Heap-Dump auf die Festplatte.
  • -XX:HeapDumpPath=<path to heap dump file>: gibt den Pfad für die Heap-Dump-Datei an.
  • -XX:OnOutOfMemoryError=<command>: bei Auftreten eines Out-Of-Memory-Fehlers führt die JVM den angegebenen Befehl aus.
  • -XX:+UseGCOverheadLimit: die JVM verwendet diese Option, um ein Limit für die Zeit festzulegen, die mit der Garbage Collection verbracht wird.

Um beispielsweise die JVM so zu konfigurieren, dass bei einem Out-Of-Memory-Fehler ein Heap-Dump unter /path/to/heapdump.hprof geschrieben wird, verwenden wir den folgenden Befehl:

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/heapdump.hprof MyApp

64-Bit JVM verwenden

Wir können den Parameter -d verwenden, um zwischen einer 32-Bit oder 64-Bit JVM zu wählen. Um beispielsweise die 64-Bit JVM zu nutzen, verwenden wir den folgenden Befehl:

java -d64 MyApp

Java-Anwendung mit JVM-Parametern kompilieren und ausführen

Verwenden wir das Programm HelloWorld.java, um die Java-Anwendung mit den in den vorherigen Schritten erlernten JVM-Parametern zu kompilieren und auszuführen.

cd ~/project
touch HelloWorld.java

Geben Sie den folgenden Code ein:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Speichern Sie die Datei und beenden Sie den Editor. Kompilieren und starten wir nun den Code mit dem Parameter -Xmx:

javac HelloWorld.java
java -Xmx512m HelloWorld

Dies setzt die maximale Heap-Größe auf 512 MB. Sie sollten die folgende Ausgabe sehen:

Hello, World!

Java-Anwendung mit Garbage Collectors kompilieren und ausführen

Kompilieren und starten wir nun die Java-Anwendung mit dem Parallel Garbage Collector:

java -XX:+UseParallelGC HelloWorld

Sie sollten die folgende Ausgabe sehen:

Hello, World!

Java-Anwendung mit Garbage-Collection-Logging kompilieren und ausführen

Kompilieren und starten wir nun die Java-Anwendung mit aktiviertem Garbage-Collection-Logging:

java -Xlog:gc*:file=gc.log:time,uptime,level,tags:filecount=10,filesize=10M HelloWorld

Dies schreibt während der Programmausführung Garbage-Collection-Protokolle in die Datei gc.log im aktuellen Verzeichnis.

Java-Anwendung mit weiteren häufig verwendeten Parametern kompilieren und ausführen

Kompilieren und starten wir nun die Java-Anwendung mit den Parametern -XX:+UseStringDeduplication und -XX:MaxHeapFreeRatio:

java -XX:+UseStringDeduplication -XX:MaxHeapFreeRatio=70 HelloWorld

Dies aktiviert die String-Deduplizierung und setzt das maximale Verhältnis des freien Heap-Speichers nach der Garbage Collection auf 70 %.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man verschiedene JVM-Parameter einsetzt, um die Leistung von Java-Anwendungen zu optimieren. Wir haben behandelt, wie man die Heap-Speichergröße festlegt, Garbage Collector auswählt, das Garbage-Collection-Logging aktiviert, Out-Of-Memory-Fehler behandelt, die 64-Bit JVM nutzt und weitere häufig verwendete Parameter konfiguriert. Zudem haben wir gelernt, wie man eine Java-Anwendung unter Verwendung dieser JVM-Parameter kompiliert und ausführt.