Skip to main content

Performance Optimization

Maximize your Minecraft server’s performance with these optimization tips.

Key Recommendations

Top optimizations for any Minecraft server:
  1. Use Paper - Switch from Vanilla/Spigot for immediate performance improvements
  2. Lower view distance - Set to 8 for most servers, 6 for busy ones
  3. Pre-generate your world - Eliminates lag from chunk generation
  4. Reduce mob spawn limits - Lower monster/animal counts in configs
  5. Use Spark - Profile your server to identify performance issues
  6. 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
SettingPlayersRecommended
view-distance1-1010
view-distance10-308
view-distance30+6

3. Pre-generate World

Generate chunks ahead of time:
  1. Install Chunky
  2. /chunky radius 5000
  3. /chunky start
  4. 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

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

RAMXmsXmx
4GB4G4G
8GB8G8G
12GB12G12G
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:
  1. Install Spark
  2. /spark profiler start
  3. Wait 5-10 minutes
  4. /spark profiler stop
  5. Analyze the report

Common Resource-Heavy Plugins

PluginIssueAlternative
DynmapRAM intensiveBlueMap (lighter)
CitizensMany NPCs = lagLimit NPC count
mcMMODatabase heavyOptimize MySQL
JobsTask schedulingReduce job checks

World Optimization

Limit World Size

Set world borders:
/worldborder set 20000
/worldborder center 0 0

Clear Unused Chunks

Use MCASelector to:
  1. Remove never-visited chunks
  2. Delete old region files
  3. 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

Monitoring Performance

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

SettingLocationValue
view-distanceserver.properties8
simulation-distanceserver.properties6
monster spawn limitbukkit.yml50
animal spawn limitbukkit.yml8
entity activation rangespigot.ymlReduce by 25%

Red Flags

IssueCauseSolution
TPS drops when exploringChunk generationPre-generate
TPS drops during combatToo many mobsLower spawn limits
Constant low TPSPlugin issueProfile with Spark
Memory issuesLeaky pluginIdentify and remove

Troubleshooting Low TPS

  1. Run /spark profiler during lag
  2. Check which methods use most CPU
  3. 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