Herní servery

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.

12. 10. 2026 · 4 min čtení

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.