Performance Optimization
Maximize your Minecraft server’s performance with these optimization tips.
Key Recommendations
Top optimizations for any Minecraft server:
- Use Paper - Switch from Vanilla/Spigot for immediate performance improvements
- Lower view distance - Set to 8 for most servers, 6 for busy ones
- Pre-generate your world - Eliminates lag from chunk generation
- Reduce mob spawn limits - Lower monster/animal counts in configs
- Use Spark - Profile your server to identify performance issues
- Keep plugins minimal - Only run what you actually need
Quick Wins
1. Use Paper
Switch from Vanilla/Spigot to Paper for immediate improvements:
- Better chunk loading
- Async operations
- Optimized entity handling
- Anti-xray built-in
2. Lower View Distance
Edit server.properties:
view-distance=8
simulation-distance=6
| Setting | Players | Recommended |
|---|
| view-distance | 1-10 | 10 |
| view-distance | 10-30 | 8 |
| view-distance | 30+ | 6 |
3. Pre-generate World
Generate chunks ahead of time:
- Install Chunky
/chunky radius 5000
/chunky start
- Wait for completion
Paper Configuration
paper-global.yml
chunk-loading:
min-load-radius: 2
max-concurrent-sends: 2
autoconfig-send-distance: true
misc:
max-joins-per-tick: 3
packet-limiter:
kick-message: "Connection throttled"
all-packets:
max-packet-rate: 500.0
paper-world-defaults.yml
chunks:
auto-save-interval: 6000
delay-chunk-unloads-by: 10s
prevent-moving-into-unloaded-chunks: true
entities:
spawning:
spawn-limits:
monsters: 50
animals: 8
water-animals: 3
water-ambient: 5
ambient: 1
environment:
disable-thunder: false
disable-ice-and-snow: false
optimize-explosions: true
hopper:
disable-move-event: false
ignore-occluding-blocks: true
Spigot Configuration
spigot.yml
world-settings:
default:
mob-spawn-range: 6
entity-activation-range:
animals: 16
monsters: 24
raiders: 48
misc: 8
water: 8
villagers: 16
flying-monsters: 32
entity-tracking-range:
players: 48
animals: 48
monsters: 48
misc: 32
other: 64
tick-inactive-villagers: false
nerf-spawner-mobs: true
merge-radius:
item: 3.5
exp: 4.0
Bukkit Configuration
bukkit.yml
spawn-limits:
monsters: 50
animals: 8
water-animals: 3
water-ambient: 5
water-underground-creature: 3
axolotls: 3
ambient: 1
chunk-gc:
period-in-ticks: 600
ticks-per:
animal-spawns: 400
monster-spawns: 4
water-spawns: 400
water-ambient-spawns: 400
water-underground-creature-spawns: 400
axolotl-spawns: 400
ambient-spawns: 400
JVM Optimization
Recommended JVM Flags
For most servers (Aikar’s Flags):
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 server.jar nogui
Memory Guidelines
| RAM | Xms | Xmx |
|---|
| 4GB | 4G | 4G |
| 8GB | 8G | 8G |
| 12GB | 12G | 12G |
Set Xms equal to Xmx for consistent performance.
Plugin Optimization
Remove Unnecessary Plugins
Each plugin adds overhead. Only keep what you need.
Identify Slow Plugins
Use Spark to profile:
- Install Spark
/spark profiler start
- Wait 5-10 minutes
/spark profiler stop
- Analyze the report
Common Resource-Heavy Plugins
| Plugin | Issue | Alternative |
|---|
| Dynmap | RAM intensive | BlueMap (lighter) |
| Citizens | Many NPCs = lag | Limit NPC count |
| mcMMO | Database heavy | Optimize MySQL |
| Jobs | Task scheduling | Reduce job checks |
World Optimization
Limit World Size
Set world borders:
/worldborder set 20000
/worldborder center 0 0
Clear Unused Chunks
Use MCASelector to:
- Remove never-visited chunks
- Delete old region files
- Reduce world size
Limit Entities
In paper-world-defaults.yml:
entities:
spawning:
per-player-mob-spawns: true
spawn-limits:
monsters: 30
animals: 5
Redstone & Hoppers
Hopper Optimization
# paper-world-defaults.yml
hopper:
cooldown-when-full: true
disable-move-event: true
ignore-occluding-blocks: true
Redstone Settings
# paper-world-defaults.yml
redstone-implementation: ALTERNATE_CURRENT
Entity Management
Villagers
Villagers are resource-intensive:
# paper-world-defaults.yml
entities:
behavior:
disable-villager-workstation-pathfinding: true
villager-max-pathfinding-range: 32.0
Item Merging
# spigot.yml
merge-radius:
item: 4.0
exp: 6.0
TPS (Ticks Per Second)
Check with /tps:
- 20 TPS = Perfect
- 18-19 TPS = Good
- 15-17 TPS = Acceptable
- Below 15 TPS = Needs optimization
Using Spark
Essential commands:
/spark profiler start
/spark tps
/spark health
/spark gc
Using Timings
Paper’s built-in tool:
/timings on
# Wait for activity
/timings paste
Quick Reference
Essential Optimizations
| Setting | Location | Value |
|---|
| view-distance | server.properties | 8 |
| simulation-distance | server.properties | 6 |
| monster spawn limit | bukkit.yml | 50 |
| animal spawn limit | bukkit.yml | 8 |
| entity activation range | spigot.yml | Reduce by 25% |
Red Flags
| Issue | Cause | Solution |
|---|
| TPS drops when exploring | Chunk generation | Pre-generate |
| TPS drops during combat | Too many mobs | Lower spawn limits |
| Constant low TPS | Plugin issue | Profile with Spark |
| Memory issues | Leaky plugin | Identify and remove |
Troubleshooting Low TPS
- Run
/spark profiler during lag
- Check which methods use most CPU
- Identify if it’s:
- Entity related → Lower spawning limits
- Chunk related → Pre-generate, lower view distance
- Plugin related → Update/remove plugin
- Redstone related → Limit complex contraptions
Next Steps