0Pricing
Java Academy · Lektion

Gängige JVM-Tuning-Flags

Heap-, GC- und JIT-Optionen

Gängige JVM-Tuning-Flags ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum die JVM optimieren?

Die JVM verfügt über sinnvolle Standardeinstellungen, aber bei anspruchsvollen Diensten passen Sie manchmal die Heap-Größe, den Garbage Collector und das JIT-Verhalten an.

Optimieren Sie erst als letzten Schritt: Führen Sie zunächst ein Profiling durch, beheben Sie den Fehler im Code und greifen Sie erst dann zu Flags, wenn Messungen dies rechtfertigen.

Heap-Größe: -Xms und -Xmx

Die beiden häufigsten Flags legen die Grenzen des Heaps fest:

  • -Xms – anfängliche Heap-Größe.
  • -Xmx – maximale Heap-Größe.

Beispiel: java -Xms512m -Xmx2g MyApp. Wenn Sie -Xms gleich -Xmx setzen, vermeiden Sie Pausen durch Größenänderungen bei lang laufenden Servern.

Die Standardeinstellungen auslesen

Sie können die JVM fragen, welche Werte sie gewählt hat. Runtime stellt die aktuellen Heap-Werte bereit, und -XX:+PrintFlagsFinal gibt den effektiven Wert jedes Flags aus.

Das Beispiel gibt die Speichergrenzen der laufenden JVM aus.

public class Main {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long mb = 1024 * 1024;
        System.out.println("Max heap (Xmx): " + (rt.maxMemory() / mb) + " MB");
        System.out.println("Total heap now: " + (rt.totalMemory() / mb) + " MB");
        System.out.println("Free in heap: " + (rt.freeMemory() / mb) + " MB");
        System.out.println("Available cores: " + rt.availableProcessors());
    }
}

Einen Collector auswählen

Moderne JDKs bieten mehrere Garbage Collector:

  • -XX:+UseG1GC – die Standardeinstellung; ausgewogen und regionsbasiert.
  • -XX:+UseZGC – extrem kurze Pausen für große Heaps.
  • -XX:+UseParallelGC – maximaler Durchsatz bei längeren Pausen.
  • -XX:+UseSerialGC – single-threaded, für kleine Anwendungen und Container.

G1-Pausenziel

G1 ist ein auf die Pausenzeit ausgerichteter Collector. Sie geben ihm ein Ziel vor, das er zu erreichen versucht:

  • -XX:MaxGCPauseMillis=200 weist G1 an, die Pausen bei etwa 200 ms zu halten.

Das Ziel ist eine weiche Vorgabe, keine Garantie. Wenn Sie es zu niedrig setzen, erzwingen Sie häufige kleine Sammlungen, was den Durchsatz beeinträchtigen kann.

ZGC für niedrige Latenz

Wenn die Pausenzeiten selbst bei Heaps mit mehreren Gigabyte unter einer Millisekunde bleiben müssen, verwenden Sie ZGC mit -XX:+UseZGC.

ZGC erledigt den größten Teil seiner Arbeit nebenläufig mit Ihren Anwendungsthreads. Der Nachteil sind etwas höhere CPU- und Speicher-Overheads im Vergleich zu G1. Ideal für latenzempfindliche Dienste.

GC-Logging

Um GC zu optimieren, müssen Sie die Vorgänge sichtbar machen. Aktivieren Sie das einheitliche Logging:

  • -Xlog:gc*:file=gc.log:time,uptime,level,tags

Damit wird jede Sammlung mit Zeitstempeln und Dauern aufgezeichnet. Übertragen Sie das Log in einen Viewer (oder in JMC/JFR), um lange oder häufige Pausen zu erkennen, bevor Sie ein Flag ändern.

Container und CPU

In Containern liest die JVM die cgroup-Limits. Standardmäßig verwendet sie einen Teil des Speicherlimits für den Heap.

  • -XX:MaxRAMPercentage=75.0 legt den Heap als Prozentsatz des Containerspeichers fest.
  • -XX:ActiveProcessorCount=N überschreibt die erkannte Anzahl der CPUs.

So vermeiden Sie, dass mehr Speicher zugesagt wird, als verfügbar ist und der Orchestrator den Prozess beendet.

JIT- und Diagnose-Flags

Ein paar weitere nützliche Flags:

  • -XX:+HeapDumpOnOutOfMemoryError — erstellt bei OOM einen Heap-Dump für eine nachträgliche Analyse.
  • -XX:HeapDumpPath=/tmp — gibt an, wohin der Heap-Dump geschrieben wird.
  • -XX:+PrintCompilation — zeigt die Aktivitäten der JIT-Kompilierung an.

Diese Optionen kosten kaum Leistung und sind hilfreich, wenn etwas schiefläuft.

Tuning-Disziplin

Goldene Regeln für Flags:

  • Ändern Sie jeweils ein Flag und messen Sie erneut im Vergleich zu einer Baseline.
  • Übernehmen Sie Flags aus Blogbeiträgen nicht blind — sie könnten für eine ältere JVM gedacht sein.
  • Die meisten Apps benötigen nur -Xmx und eventuell eine Collector-Auswahl; die Standardwerte sind gut.

Metaspace und Threads

Der Heap ist nicht der einzige Speicherbereich:

  • -XX:MaxMetaspaceSize begrenzt den Speicher für Klassenmetadaten; ohne diese Begrenzung kann ein Leak beim Laden von Klassen den nativen Speicher erschöpfen.
  • -Xss legt die Stack-Größe pro Thread fest; reduzieren Sie sie, wenn Sie sehr viele Threads ausführen, und erhöhen Sie sie bei tiefer Rekursion.

Diese Optionen müssen nur selten angepasst werden, aber ihr Zweck ist hilfreich zu kennen, wenn der native Speicher und nicht der Heap das Problem darstellt.

Kurzer Test

Was steuern die Flags -Xms und -Xmx?

Zusammenfassung

Die wichtigsten Flags:

  • -Xms / -Xmx begrenzen den Heap.
  • Wählen Sie einen Collector: G1 (Standard), ZGC (kurze Pausen), Parallel (Durchsatz).
  • Legen Sie für G1 -XX:MaxGCPauseMillis fest; aktivieren Sie zur Beobachtung -Xlog:gc*.
  • Verwenden Sie in Containern MaxRAMPercentage und für mehr Sicherheit HeapDumpOnOutOfMemoryError.
  • Ändern Sie jeweils ein Flag und messen Sie die Auswirkungen.

Häufig gestellte Fragen

Ist die Lektion „Gängige JVM-Tuning-Flags“ kostenlos?

Ja — der vollständige Text von „Gängige JVM-Tuning-Flags“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Gängige JVM-Tuning-Flags“?

Heap-, GC- und JIT-Optionen Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Gängige JVM-Tuning-Flags“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Bottlenecks identifizieren
  2. Java Flight Recorder
  3. Analysieren mit JDK Mission Control
  4. Gängige JVM-Tuning-Flags
← Zurück zu Java Academy