Aikar flags a nastavení JVM pro Minecraft server
Co jsou Aikar flags, proč Xms a Xmx nastavit stejně, kolik paměti dát serveru, rozdíl mezi heap a limitem kontejneru a jak flagy použít v Pterodactylu.
Minecraft server běží v Javě a velkou část „záseků“ nezpůsobuje hra, ale garbage collector – část JVM, která uvolňuje nepoužívanou paměť. Když se GC na chvíli zastaví celou aplikaci, server přeskočí ticky a hráči vidí lag. Sada JVM parametrů známá jako Aikar flags ladí garbage collector G1 přesně pro chování Minecraft serveru a je dnes doporučená v dokumentaci PaperMC.
Doporučené flagy
Startovní příkaz pro server s 10 GB RAM:
java -Xms10G -Xmx10G \
-XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled \
-XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC \
-XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 \
-XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimeTarget=5 \
-XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 \
-XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 \
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true \
-jar server.jar --nogui
Pro servery s víc než 12 GB heapu se mění několik hodnot:
-XX:G1NewSizePercent=40
-XX:G1MaxNewSizePercent=50
-XX:G1HeapRegionSize=16M
-XX:G1ReservePercent=15
-XX:InitiatingHeapOccupancyPercent=20
Na novějších verzích Javy může JVM u některé volby (např. G1RSetUpdatingPauseTimeTarget) vypsat varování, že je zastaralá a ignoruje se. Server tím nijak netrpí. Aktuální doporučenou sadu najdete v dokumentaci PaperMC (docs.papermc.io), kde je i generátor startovních skriptů.
Co dělají ty nejdůležitější
| Flag | Význam |
|---|---|
-Xms = -Xmx |
Heap má od startu plnou velikost, JVM ho nemusí zvětšovat a zmenšovat |
-XX:+UseG1GC |
Garbage collector G1 |
-XX:MaxGCPauseMillis=200 |
Cílová maximální pauza GC |
-XX:G1NewSizePercent=30 |
Větší „mladá generace“ – Minecraft vytváří obrovské množství krátkodobých objektů |
-XX:MaxTenuringThreshold=1 |
Objekty, které přežijí jeden úklid, rovnou povýší – zbytečně je nekopíruje |
-XX:+AlwaysPreTouch |
Při startu fyzicky alokuje celou paměť – pomalejší start, stabilnější běh |
-XX:+DisableExplicitGC |
Ignoruje System.gc() z pluginů, které by vyvolaly plný úklid |
Kolik paměti dát serveru
Víc paměti není automaticky lepší. Velký heap znamená méně častý, ale potenciálně delší úklid. Orientačně:
- Paper s pár pluginy a do 20 hráčů: 4–6 GB,
- větší survival s pluginy: 6–10 GB,
- velké modpacky: 8–12 GB a víc.
Rozhodující je měření: /spark health ukazuje využití heapu a statistiky GC. Pokud heap po úklidu klesá hluboko pod limit, paměti je dost.
Dejte pozor na minimální hodnotu – na stroji s 8 GB RAM nedávejte serveru 8 GB heapu. Systém, JVM mimo heap (metaspace, vlákna, nativní knihovny) a další procesy potřebují svoje.
Heap vs. limit kontejneru
JVM používá paměť i mimo heap. Pokud server běží v kontejneru (Pterodactyl, Docker) s limitem 8 GB a nastavíte -Xmx8G, celkový proces limit překročí a kontejner ukončí OOM killer. V konzoli to vypadá jako náhlé ukončení serveru bez chybové hlášky v Javě.
Pravidlo: nechte rezervu přibližně 10–15 % nebo aspoň 1 GB mezi -Xmx a limitem kontejneru.
Aikar flags v Pterodactylu
Výchozí Paper egg má startovní příkaz zhruba:
java -Xms128M -Xmx{{SERVER_MEMORY}}M -Dterminal.jline=false -Dterminal.ansi=true -jar {{SERVER_JARFILE}}
{{SERVER_MEMORY}} je limit paměti serveru v MB. Upravte příkaz v administraci u serveru (záložka Startup) nebo v kopii eggu, například s rezervou 15 %:
java -Xms$(({{SERVER_MEMORY}}*85/100))M -Xmx$(({{SERVER_MEMORY}}*85/100))M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimeTarget=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar {{SERVER_JARFILE}}
Aritmetika $((...)) funguje, protože startovní příkaz v oficiálních Java image (yolks) vyhodnocuje shell. Pokud používáte jiný image, ověřte v konzoli po startu, že JVM dostala číslo, ne doslovný text. Kontrola z běžícího serveru: /spark health ukazuje maximální velikost heapu.
Verze Javy
- Minecraft 1.20.5 a novější: Java 21.
- 1.18–1.20.4: Java 17.
- Starší verze: Java 8–16 podle verze a modloaderu.
Novější Java obvykle přináší lepší GC. V Pterodactylu verzi měníte výběrem Docker image v záložce Startup.
Alternativy k G1
Na Javě 21 lze vyzkoušet generační ZGC (-XX:+UseZGC -XX:+ZGenerational), který má velmi krátké pauzy, ale vyšší režii CPU a paměti. Pro většinu serverů zůstávají Aikar flags s G1 bezpečnou volbou. Pokud experimentujete, měňte jednu věc a porovnávejte MSPT a pauzy GC ve spark reportu.
Další tipy na výkon serveru najdete v článku Optimalizace Minecraft serveru Paper.