Minecraft Server用として使うガベージコレクションを4種類まとめて見たので、
どれが一番よかったか、どの環境に適していそうかを書き出していきます!
検証環境
server スペック
vCPU4コア(intel core i5-11400)
RAM10GB(ddr4 3200)
nvme ssd(gen4×4)
minecraft server
Paper 1.21.4-147-main@3bd69f2 (2025-02-10T22:59:40Z) for Minecraft 1.21.4
OpenJDK 64-Bit Server VM 21.0.3+9-LTS
paper付属のspark以外の追加pluginはありません。
負荷のかけ方
村人のAIが重いことを利用してベンチマーク?みたいなものをしたので誤差はありますが、
実際のentityなので入る人数に意外と直結するかも?です!
判断基準
判断スーパーフラットに村人を1200体入れた同じワールドでsparkを使用し、
起動から5分間前後モニタリングした時のデータで判断しています。
村人以外スポーンせず、
村人は圧死するギリギリの数に合わせて密度を最大まで高くして負荷を最大限高めています。
判断材料に使う項目は
- MSPT(med)
- MSPT(95%ile)
- TPS
- Memory(process)
- net.minecraft.server.MinecraftServer.waitUntilNextTick()
この項目を主にみていきます。
MSPT(MAX)は基本的にサーバー起動時の数値なので当てにならないので今回は考えないこととします
これらの項目の説明は以下のグラフを参照してください
/ | 説明 |
MSPT(med) | MSPTの中央値 |
MSPT(95%ile) | MSPTの上位5%を除いた値全体の平均 |
TPS | サーバーが一秒間に計算したtick数 |
Memory(process) | -Xms5G -Xmx5Gで割り当てたメモリーからどれだけ使っているか |
net.minecraft.server.MinecraftServer.waitUntilNextTick() | Minecraft サーバーから認識したCPUの空き率 |


ベンチマークの結果
実際のCPU RAM SSDの性能に左右される部分もあるので、
実際に検証した起動引数も載せておきます
デフォルトとなる起動引数
ひとまず基準となる起動引数を載せておきます
java -Xms5G -Xmx5G -XX:MaxRAMPercentage=95.0 -Dterminal.jline=false -Dterminal.ansi=true -jar server.jar --nogui
基準の引数でのsparkの結果
/ | 実測値 |
CPU使用率(15m)(%) | 19.33 |
MSPT(med) | 34.1 |
MSPT(95%ile) | 48.5 |
TPS-1m/5m/15m | 20/20/20 |
Memory(process)GB | 1.9 |
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%) | 21.72 |
何もせずにこれだけ耐えれるのなら意外と優秀かも?
ただしCPU使用率(waitUntilNextTick)が高めなので人は入らなさそう。


UseG1GC
特徴:
- レイテンシーはそこまで良くない
- tick timeはとても安定してる
- 設定が大まかなならこれが一択 詰めた設定するなら次のUseParallelGCがお勧め
- シングルコアは気にしなくても安定する
java -Xms5G -Xmx5G -XX:+UseG1GC -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=16 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs/ -Daikars.new.flags=true -jar server.jar --nogui
基準の引数でのsparkの結果
/ | 実測値 |
CPU使用率(15m)(%) | 15.45 |
MSPT(med) | 26 |
MSPT(95%ile) | 41.3 |
TPS-1m/5m/15m | 20/20/20 |
Memory(process)GB | 2 |
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%) | 36.91 |
デフォルトよりも結果がよくなった!
waitUntilNextTickも落ち着いてし無難なのがG1だと思う。


UseParallelGC
特徴:
- レイテンシーはそこそこ
- tick timeは並列をし始めるとムラが発生するので1-2スレッド指定が一番安定した
- 設定を詰めたらこれが一番よさそう
- シングルコアはそこそこいる
java -Xms5G -Xmx5G -XX:+UseParallelGC -XX:ParallelGCThreads=1 -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=3 -XX:SurvivorRatio=18 -jar server.jar --nogui
基準の引数でのsparkの結果
/ | 実測値 |
CPU使用率(15m)(%) | 15.17 |
MSPT(med) | 25.6 |
MSPT(95%ile) | 38.7 |
TPS-1m/5m/15m | 20/20/20 |
Memory(process)GB | 1.1 |
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%) | 37.28 |
waitUntilNextTickの空きがとてもあるしMSPTも低い
メモリーの使用率も低いからとても良い
シングルスレッドの強いサーバ(コンシューマー向けCPUなど)でサバ運営の場合は一番お勧めできる


UseZGC
特徴:
- 並列処理が得意っぽい
- ただしtick timeムラが発生しやすい
- 並列処理をしないとまともに動かない
- ムラが若干あったけど鯖の起動が一番早かった
- シングルコアは弱くてもある程度動く
java -Xms5G -Xmx5G -XX:+UseZGC -XX:+ParallelRefProcEnabled -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:ZUncommitDelay=300 -XX:ZAllocationSpikeTolerance=5 -XX:ConcGCThreads=3 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs/ -Daikars.new.flags=true -jar server.jar --nogui
基準の引数でのsparkの結果
/ | 実測値 |
CPU使用率(15m)(%) | 17.85 |
MSPT(med) | 32.6 |
MSPT(95%ile) | 43.6 |
TPS-1m/5m/15m | 20/20/20 |
Memory(process)GB | 1.9 |
net.minecraft.server.MinecraftServer.waitUntilNextTick()(%) | 24.52 |
CPU使用率のばらつきが少ない、
比較的にCPUが弱くても動きそう…
一般的なレンタルサーバなどのCPUクロックが低めでコア数が多いサーバーならありかも。
その他ならUseParallelGC使って見てほしい!


環境ごとのおすすめ
データがそろったのでまとめに入りたいと思います
おすすめ度 | メリット | デメリット | |
指定なし | 1/5 | 設定が簡単 | 動作が重い |
UseG1GC | 2/5 | スペックに左右されずに動作する印象 | 設定をちゃんとしないと軽くならない |
UseParallelGC | 5/5 | とても軽量 | シングルコア性能が高くないと軽量化できなさそう |
UseZGC | 2/5 | GCをマルチスレッド化して動かせるからCPU弱い場合に使いたい | 若干不安定になる気がする? |
papermcはシングルスレッド動作なので、
シングルコア性能が高いサーバーを借りたら幸せになれます!
最後に
一回自分の環境ですべて試してみて
自分が好きなガベージコレクションを選んで設定を確認してみてください!
コメント