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=200weist 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.0legt 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
-Xmxund eventuell eine Collector-Auswahl; die Standardwerte sind gut.
Metaspace und Threads
Der Heap ist nicht der einzige Speicherbereich:
-XX:MaxMetaspaceSizebegrenzt den Speicher für Klassenmetadaten; ohne diese Begrenzung kann ein Leak beim Laden von Klassen den nativen Speicher erschöpfen.-Xsslegt 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/-Xmxbegrenzen den Heap.- Wählen Sie einen Collector: G1 (Standard), ZGC (kurze Pausen), Parallel (Durchsatz).
- Legen Sie für G1
-XX:MaxGCPauseMillisfest; aktivieren Sie zur Beobachtung-Xlog:gc*. - Verwenden Sie in Containern
MaxRAMPercentageund für mehr SicherheitHeapDumpOnOutOfMemoryError. - Ä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
- Bottlenecks identifizieren
- Java Flight Recorder
- Analysieren mit JDK Mission Control
- Gängige JVM-Tuning-Flags