Minecraft Server Garbage Collection optimieren: JVM-Lag-Spikes endgültig beseitigen
# Minecraft Server Garbage Collection optimieren: JVM-Lag-Spikes endgültig beseitigen
Dein Server läuft minutenlang flüssig mit 20 TPS, bricht dann aber plötzlich für ein oder zwei Sekunden auf 12 TPS ein — ohne ersichtlichen Grund. Wenn dir das bekannt vorkommt, ist Java Garbage Collection (GC) mit hoher Wahrscheinlichkeit der Schuldige. Das ist eine der am häufigsten missverstandenen Lag-Quellen auf Minecraft-Servern — und sie zu beheben kann die Spielerfahrung drastisch verbessern.
In diesem Guide erklären wir, was Garbage Collection ist, warum sie Lag-Spikes verursacht und welche JVM-Flags du genau verwenden solltest, um das Problem zu minimieren.
Was ist Garbage Collection und warum verursacht sie Lag?
Minecraft (und die zugehörige Serversoftware) läuft auf der Java Virtual Machine (JVM). Java verwaltet den Speicher automatisch — wenn Objekte nicht mehr benötigt werden (alte Chunks, despawnte Entities, abgelaufene Timer), gibt der Garbage Collector diesen Speicher wieder frei.
Das Problem: Während einer GC-Pause stoppt die JVM kurzzeitig alle Anwendungs-Threads. Für einen Minecraft-Server bedeutet das, dass die gesamte Tick-Loop einfriert. Selbst eine 200ms-GC-Pause führt direkt zu einem sichtbaren Lag-Spike für alle Online-Spieler.
Standardmäßig verwendet Java keine Einstellungen, die für Minecrafts Speichernutzungsmuster optimiert sind. Den Garbage Collector zu tunen ist eine der wirkungsvollsten Optimierungen, die du vornehmen kannst — und sie erfordert keinerlei Änderungen an Plugins oder Konfigurationsdateien.
Die besten JVM-Flags für Minecraft-Server (Aikar's Flags)
Der Goldstandard für JVM-Tuning auf Minecraft-Servern sind Aikar's Flags — eine Reihe von G1GC-Parametern, die speziell für Minecrafts Heap-Verhalten entwickelt wurden. Sie werden von Paper, Purpur und den meisten großen Server-Netzwerken empfohlen.
Hier sind die Flags für Server mit 12 GB RAM oder mehr:
java -Xms12G -Xmx12G \
-XX:+UseG1GC \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC \
-XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 \
-XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 \
-XX:G1HeapWastePercent=5 \
-XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 \
-XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 \
-XX:SurvivorRatio=32 \
-XX:+PerfDisableSharedMem \
-XX:MaxTenuringThreshold=1 \
-Dusing.aikars.flags=https://mcflags.emc.gs \
-jar paper.jar --nogui
Für Server mit weniger als 12 GB RAM passe diese beiden Werte an:
-XX:G1NewSizePercent=20
-XX:G1MaxNewSizePercent=30
Warum diese Einstellungen funktionieren
-XX:+UseG1GC— Wechselt zum Garbage-First-Collector, der kurze und vorhersehbare Pausen priorisiert statt maximalen Durchsatz.-XX:MaxGCPauseMillis=200— Weist G1GC an, Pausen unter 200ms anzustreben. Das wird nicht immer gelingen, aber es lenkt das Verhalten des Collectors.-XX:InitiatingHeapOccupancyPercent=15— Startet GC-Zyklen früher (bei 15% Heap-Auslastung) statt zu warten, bis der Heap fast voll ist. Das verhindert massive Stop-the-World-Collections.-XX:AlwaysPreTouch— Reserviert beim Start sofort den gesamten RAM statt erst bei Bedarf. Das verhindert Speicher-Verzögerungen auf OS-Ebene während des Spiels.-XX:+DisableExplicitGC— Verhindert, dass PluginsSystem.gc()manuell aufrufen, was zu Full-GC-Pausen zum denkbar ungünstigsten Zeitpunkt führen kann.-Xmsgleich-Xmx— Gleiche Werte für minimalen und maximalen Heap verhindern, dass die JVM den Heap zur Laufzeit verändert — was eigene Pausen verursachen würde.
Sollte man ZGC oder Shenandoah verwenden?
Neuere Low-Latency-Garbage-Collector wie ZGC (Java 15+) und Shenandoah (Java 11+) zielen auf Sub-Millisekunden-Pausen ab, indem sie die meiste Arbeit parallel erledigen.
Für Minecraft-Server ist das Bild gemischt:
- ZGC funktioniert gut auf Servern mit sehr großen Heaps (32 GB+) oder sehr hohen Spielerzahlen, bei denen G1GC noch Probleme hat. Verwende
-XX:+UseZGCund lass die anderen G1-spezifischen Flags weg. - Shenandoah zeigt ähnliche Eigenschaften, ist aber nur in OpenJDK-Builds verfügbar, nicht im Oracle JDK.
- G1GC mit Aikar's Flags bleibt die beste Wahl für die meisten Server im Bereich 4–16 GB.
Eine minimale Startzeile für ZGC sieht so aus:
java -Xms10G -Xmx10G -XX:+UseZGC -XX:+AlwaysPreTouch -jar paper.jar --nogui
Die richtige Java-Version wählen
Betreibe deinen Minecraft-Server immer mit Java 21 (LTS). Jede große Java-Version bringt GC-Verbesserungen:
- Java 21 hat die G1GC-Pausenzeiten im Vergleich zu Java 11 oder 17 deutlich verbessert
- Java 21 enthält virtuelle Threads (Project Loom), die Folia und zukünftige Paper-Builds nutzen
- Vermeide Java 8 vollständig für moderne Paper/Purpur-Server — das GC-Verhalten ist deutlich schlechter
Prüfe deine aktuelle Version mit:
java -version
GC-Pausen in der Praxis überwachen
Tuning ohne Daten ist Raten. Füge diese Flags hinzu, um GC-Logging zu aktivieren:
-Xlog:gc*:logs/gc.log:time,uptime:filecount=5,filesize=10m
Das erstellt rotierende GC-Logs in deinem logs/-Ordner. Suche nach Zeilen mit Pausenzeiten über 100ms — das sind deine Problemstellen.
Für laufendes Monitoring verfolgt [PulseNode](https://pulsenode.tech) TPS und Performance deines Servers über Zeit. So lassen sich GC-bedingte Lag-Spikes mit realem Spielerimpact korrelieren, ohne rohe Log-Dateien durchsuchen zu müssen.
Häufige Fehler vermeiden
- Zu viel RAM zuweisen — Kontraintuitiv: 32 GB zuzuweisen, wenn der Server nur 8 GB braucht, macht GC schlechter. Größere Heaps bedeuten mehr zu scannende Objekte. Starte mit 6–10 GB und erhöhe nur, wenn die Heap-Auslastung konstant über 80% liegt.
-XX:+UseConcMarkSweepGCverwenden — Dieser Collector ist veraltet und in Java 14+ entfernt worden. Niemals verwenden.- Verschiedene
-Xms- und-Xmx-Werte — Halte sie immer gleich, um Heap-Resize-Pausen zu vermeiden. - Mehrere Server in einer JVM — Jede Serverinstanz sollte ihren eigenen JVM-Prozess mit eigener Speicherzuweisung haben.
Schnell-Checkliste
- [ ] Java 21 LTS verwenden
- [ ] Aikar's Flags mit gleichen
-Xms- und-Xmx-Werten anwenden - [ ] RAM nicht übermäßig zuweisen (unter 16 GB bleiben, sofern nicht nötig)
- [ ] GC-Logging aktivieren, um Verbesserungen zu verifizieren
- [ ] TPS-Stabilität nach Änderungen überwachen
Fazit
Garbage-Collection-Tuning ist eine dieser Optimierungen, die unsichtbar ist, wenn sie funktioniert — dein Server läuft einfach flüssig ohne mysteriöse Lag-Spikes. Aikar's Flags anzuwenden dauert keine fünf Minuten und kann die nervigste Art von Minecraft-Server-Lag vollständig eliminieren.
Nachdem du deine Startflags aktualisiert hast, nutze [PulseNode](https://pulsenode.tech), um deine TPS in den folgenden Tagen zu überwachen und zu bestätigen, dass die Spikes verschwunden sind. Falls nicht, zeigen dir die GC-Logs genau, wo du als nächstes suchen musst.