Minecraft Server Optimization Guide
Tune your Minecraft server for stable TPS, Paper config, view distance, mob caps, JVM flags and the real bottlenecks.
If your Minecraft server stutters, drops TPS, or struggles at 30 players when it should hold 100, the cause is almost always one of five things: too many entities, too many chunks loaded, GC pauses, a slow disk, or a CPU that can't keep up. Here's how to fix each.
1. Measure before you tune
Install Spark (spark.lucko.me). Run:
/spark profiler start --thread main
# wait through a slow period
/spark profiler stop
The flame graph tells you exactly which class is eating the main thread.
2. Paper config , the must-change knobs
In config/paper-global.yml and config/paper-world-defaults.yml:
# paper-world-defaults.yml
chunks:
max-auto-save-chunks-per-tick: 24
entities:
spawning:
per-player-mob-spawns: true
spawn-limits:
monster: 50
animal: 6
water-animal: 3
collisions:
max-entity-collisions: 2
per-player-mob-spawns is the single biggest win on most servers , it stops the global mob cap from being eaten by one AFK player.
3. View distance vs simulation distance
In server.properties:
view-distance=8
simulation-distance=6
view-distance = how many chunks the client sees. simulation-distance = how many chunks tick (mobs, redstone, growth). Simulation distance is the expensive one. 6 is the sweet spot for most servers.
4. Entity caps and item merging
Items dropping in massive farms kill TPS. In Paper config:
entities:
spawning:
despawn-ranges:
monster: {soft: 24, hard: 64}
item-merge-radius: 4.0
exp-merge-radius: 4.0
5. Redstone
If a single redstone farm tanks the whole server, install Alternate Current (a faster redstone implementation). It's a server jar plugin , drop in and forget.
6. JVM flags , Aikar's flags
The community-standard JVM flags for any modern Paper server:
java -Xms8G -Xmx8G \
-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 paper.jar nogui
Set Xms = Xmx. Don't allocate more than 50% of system RAM.
7. Disk and chunks
Pre-generate the world to avoid live chunk-gen lag:
/chunky world world
/chunky radius 5000
/chunky start
Use Chunky at server startup before opening to players. Saves enormous amounts of mid-play stutter.
8. The plugins that always need tuning
- EssentialsX: disable per-player UUID lookups in
config.yml. - CoreProtect: on MySQL, schedule purges , see CoreProtect guide.
- WorldGuard: avoid global flags on huge worlds.
- MythicMobs: avoid skills with
~onTimershorter than 20 ticks.
9. The 5 quick wins checklist
- Switch to Paper if you're on Spigot or vanilla.
- Set
simulation-distance: 6. - Enable
per-player-mob-spawns: true. - Apply Aikar's flags.
- Pre-generate world borders with Chunky.
Prefer a server that's already tuned for this? Astroworld MC runs a hand-optimised Paper stack with custom plugins so you can just log in and play.