We ran every metadata rule in the Zerve Spark Analyzer against 7,661 real Minecraft server profiles from the Birdflop performance dataset. No cherry-picking, no synthetic data. Every number in this post comes from that run.
Here’s what stood out.
Half the servers aren’t on Java 21 yet
| Java version | Share |
|---|---|
| 21 | 51.5% |
| 17 | 34.9% |
| 16 | 1.6% |
| 22+ | 4.3% |
| 11 or older | 1.6% |
Java 21 brings real GC and JIT improvements over 17. The performance gap isn’t theoretical: G1GC’s region management is measurably better in 21, and the newer C2 compiler produces tighter code for Minecraft’s allocation-heavy workload. If you’re still on 17 because “it works,” you’re leaving free performance on the table.
15% of servers have Xms far below Xmx
1,177 out of 7,661 profiles (15.4%) have -Xms set to a different value than -Xmx. Many of these are shared hosts using -XX:MaxRAMPercentage with a small initial heap.
The problem: every time the JVM grows the heap from Xms toward Xmx, it triggers a GC pause. On a Minecraft server, that pause freezes every connected player. Setting -Xms equal to -Xmx eliminates these resize pauses entirely. It’s the single easiest JVM change you can make.
Almost nobody tunes G1GC
Of the servers that explicitly set -XX:+UseG1GC in their JVM args, only 1.6% have the full set of Aikar’s tuning flags.
The key flags most servers are missing:
G1NewSizePercent=30/G1MaxNewSizePercent=40(keeps the young generation large)InitiatingHeapOccupancyPercent=15(starts concurrent marking early)MaxTenuringThreshold=1(promotes objects faster)SurvivorRatio=32(reduces survivor space overhead)
These flags exist because Minecraft’s allocation pattern is unusual: it allocates heavily in the young generation every tick, and most objects die within one GC cycle. Default G1GC settings assume a general-purpose workload and leave significant performance on the table. See Aikar’s JVM Flags Explained for what each flag does, or Best JVM Flags for Minecraft Servers in 2026 if you’re deciding between G1GC, ZGC, and Shenandoah for a new setup.
14% of servers have GC pauses over 400ms
1,101 profiles (14.4%) triggered our critical GC pause finding, meaning their average GC pause exceeded 400ms. That’s 8 full ticks of freeze.
The breakdown by collector:
- Most are G1GC with default tuning (see above)
- A handful are using SerialGC or ParallelGC, which are throughput-oriented collectors unsuitable for latency-sensitive workloads like game servers
If your GC pauses are this long, the fix is almost always: switch to (or properly tune) G1GC, set Xms equal to Xmx, and apply Aikar’s flags. If you’re on Java 17+, ZGC is also worth testing.
33% of servers have TPS problems
2,516 profiles (32.8%) triggered at least one TPS finding:
- 846 (11%) are in critical condition (TPS below 15)
- 649 (8.5%) have TPS below 18 but above 15
- 1,267 (16.5%) have median tick time over budget (over 50ms)
- 1,111 (14.5%) have regular tick spikes (p95 over 50ms)
A third of all servers in this dataset are visibly lagging. That’s the market.
6% of servers disable network compression
472 profiles have network-compression-threshold set to -1 (disabled) while running with 10 or more players. Disabling compression saves a tiny amount of CPU but dramatically increases bandwidth per player. On shared hosts with bandwidth caps, this can cause packet loss and rubber-banding that looks like server lag but isn’t.
The config mistakes are predictable
| Finding | Trigger rate |
|---|---|
| View distance above 12 | 6.2% |
| Simulation distance above 10 | 2.9% |
| Spawn limits at default with 8000+ entities | 0.4% |
| Entity activation range at default with 8000+ entities | 0.5% |
These numbers are lower than we expected. Most servers in this dataset have reasonable configs. The servers that are lagging are mostly lagging because of JVM tuning (or lack thereof), not because of bad Paper/Spigot settings.
What we learned
The single highest-impact optimization for most Minecraft servers is not a config file change. It’s JVM flags. Specifically:
- Set Xms equal to Xmx. Eliminates heap resize pauses.
- Apply Aikar’s flags. Tunes G1GC for Minecraft’s allocation pattern.
- Upgrade to Java 21. Better GC, better JIT, free performance.
These three changes are free, take five minutes, and would improve performance for the majority of the 7,661 servers in this dataset.
Want to see what your own server looks like? Paste your Spark profiler URL into the Zerve Spark Analyzer. It’s free, no signup required, and you get a shareable link to your results.