Minecraft Server Startoptimierung: JVM-Flags, Aikars Flags und Launch-Skripte erklärt
# Minecraft Server Startoptimierung: JVM-Flags, Aikars Flags und Launch-Skripte erklärt
Die meisten Minecraft-Serveradmins kämpfen gegen Lag mit Config-Dateien und Plugin-Anpassungen — dabei übersehen sie eine der wirkungsvollsten Optimierungen überhaupt: wie der Server gestartet wird. Die JVM-Flags beim Start bestimmen direkt, wie Java Speicher verwaltet, Code kompiliert und den Garbage Collector ausführt. Wer diese falsch setzt, riskiert Lag-Spikes, lange Startzeiten und verschwendeten RAM — selbst auf leistungsstarker Hardware.
Dieser Leitfaden erklärt alles, was du für das perfekte Minecraft-Server-Startskript wissen musst.
---
Warum JVM-Flags so wichtig sind
Minecraft läuft auf der Java Virtual Machine (JVM). Die JVM ist verantwortlich für:
- Zuweisung und Verwaltung von RAM (Heap-Speicher)
- Den Garbage Collector (GC), der nicht mehr benötigte Objekte freigibt
- Just-in-time (JIT)-Kompilierung von Java-Bytecode in nativen Maschinencode
Ohne Tuning verwendet Java generische Standardwerte, die für Desktop-Anwendungen gedacht sind — nicht für einen dauerhaft laufenden, latenzkritischen Spielserver. Das Ergebnis: lange GC-Pausen, langsames Laden von Klassen und instabile TPS.
---
Aikars Flags: Der Goldstandard für Minecraft-Server
[Aikars Flags](https://aikar.co/2018/07/02/tuning-the-jvm-g1gc-garbage-collector-flags-for-minecraft/) sind ein bekannter Satz von JVM-Argumenten, der speziell für Minecraft optimiert wurde. Sie konfigurieren den G1GC-Garbage-Collector so, dass Pausenzeiten minimiert und Minecrafts spezifische Speicherallokationsmuster optimal behandelt werden.
Hier ist der vollständige empfohlene Startbefehl 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 \
-Daikars.new.flags=true \
-jar server.jar --nogui
Für Server mit weniger als 12 GB solltest du -XX:G1HeapRegionSize auf 4M und -XX:G1NewSizePercent auf 20 reduzieren.
Wichtige Flags erklärt
| Flag | Funktion |
|---|---|
| -Xms / -Xmx | Legt minimale und maximale Heap-Größe fest. Immer gleich setzen, um Heap-Resizing-Pausen zu vermeiden. |
| -XX:+UseG1GC | Aktiviert den G1-Garbage-Collector, optimiert für kurze Pausenzeiten. |
| -XX:MaxGCPauseMillis=200 | Gibt dem GC das Ziel vor, Pausen unter 200 ms zu halten. |
| -XX:+AlwaysPreTouch | Reserviert den gesamten RAM beim Start, verhindert schrittweise Verlangsamung. |
| -XX:+DisableExplicitGC | Verhindert, dass Plugins System.gc() aufrufen und vollständige GC-Pausen auslösen. |
| -XX:InitiatingHeapOccupancyPercent=15 | Startet GC-Zyklen früher, bevor Speicherdruck entsteht. |
| -XX:+PerfDisableSharedMem | Verhindert, dass die JVM Performance-Daten auf die Festplatte schreibt und I/O-Stalls verursacht. |
---
Java-Version: Welche solltest du verwenden?
Für Minecraft 1.21+ empfehlen wir immer Java 21 (LTS). Java 21 enthält erhebliche Verbesserungen am G1GC und führt virtuelle Threads ein, die Paper und Folia für besseres asynchrones Task-Handling nutzen können.
Verwende keinesfalls Java 8 im Jahr 2024. Es fehlen Jahre an GC-Verbesserungen und Sicherheits-Patches.
Java-Version prüfen:
java -version
Java 21 auf Ubuntu/Debian installieren:
apt install openjdk-21-jdk-headless
---
ZGC: Besser als G1GC?
Für Server mit sehr großem Heap (32 GB+) oder Java 21 lohnt sich ein Experiment mit ZGC. ZGC ist ein nahezu pausenfreier Garbage Collector, der große Heaps hervorragend verwaltet.
Um zu ZGC zu wechseln, ersetze die GC-bezogenen Flags durch:
-XX:+UseZGC -XX:+ZGenerational
-XX:+ZGenerational ist ein Java-21-Feature, das ZGC generational macht und den Durchsatz für typische Minecraft-Workloads deutlich verbessert.
Hinweis: ZGC verbraucht mehr CPU als G1GC. Auf Maschinen mit wenigen Kernen bleibt G1GC die bessere Wahl.
---
Ein ordentliches Startskript schreiben
Ein einfaches java -jar server.jar reicht nicht aus. Hier ist ein produktionsreifes start.sh-Skript:
#!/bin/bash
MEM="10G"
JAR="paper-1.21.jar"
java -Xms$MEM -Xmx$MEM \
-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 \
-jar $JAR --nogui
Mit chmod +x start.sh ausführbar machen und in einer screen- oder tmux-Session starten, damit der Server nach dem Abmelden weiterläuft.
---
Häufige Fehler vermeiden
-Xmxhöher als verfügbarer RAM setzen. Das führt dazu, dass das OS auf die Festplatte auslagert — katastrophal langsam. Mindestens 1-2 GB für das Betriebssystem freilassen.-Xmsniedriger als-Xmxsetzen. Dadurch vergrößert die JVM den Heap schrittweise und erzeugt Pausen.--noguivergessen. Die Swing-GUI verschwendet CPU und RAM auf Headless-Servern.- Mehrere Server in derselben JVM betreiben. Jeder Server braucht seinen eigenen Prozess.
- Flags nach einem Java-Upgrade nicht aktualisieren. Manche Flags sind versionsspezifisch.
---
Den Effekt überwachen
Nach dem Anwenden neuer JVM-Flags solltest du prüfen, ob sie tatsächlich helfen. Achte auf:
- Reduzierte GC-Pausenhäufigkeit und -dauer (sichtbar in Server-Logs mit
-Xlog:gc*) - Stabile TPS ohne Lag-Spikes alle paar Minuten
- Gleichmäßigere Speichernutzung über Zeit
[PulseNode](https://pulsenode.tech) überwacht automatisch TPS, Speicherverbrauch und Performance-Trends deines Servers — so siehst du sofort, ob dein JVM-Tuning wirkt, ohne mühsam durch rohe Logs zu scrollen.
---
Schnellreferenz: Flags nach RAM-Größe
| Server-RAM | Empfohlener GC | G1HeapRegionSize | G1NewSizePercent |
|---|---|---|---|
| 4–8 GB | G1GC | 4M | 20 |
| 8–16 GB | G1GC | 8M | 30 |
| 16–32 GB | G1GC | 16M | 30 |
| 32 GB+ | ZGC (Java 21) | – | – |
---
Fazit
Dein Startskript ist das Fundament, auf dem alles andere aufbaut. Falsche JVM-Flags können jede andere Optimierung zunichtemachen — egal wie gut paper-world.yml oder spigot.yml konfiguriert sind. Investiere 10 Minuten, um das richtig aufzusetzen, und dein Server läuft von der ersten Tick an stabiler.
Starte mit Aikars Flags, passe die Heap-Größe an deinen verfügbaren RAM an, und steige auf Java 21 um, falls noch nicht geschehen. Dann beobachte die Ergebnisse — denn Optimierung ohne Messung ist nur Raten.
---
*Möchtest du sehen, wie dein Server nach diesen Änderungen performt? [PulseNode](https://pulsenode.tech) liefert dir Echtzeit-TPS-Monitoring und historische Performance-Daten, damit du genau weißt, was funktioniert.*