垃圾回收与卡顿
为什么服务器在 TPS 正常时也会卡住几秒:垃圾回收如何运作、如何在日志中看到它,以及什么才真正有用。
更新于 2026年8月13日
Java 会在停顿中释放内存:应用停止运行,垃圾回收器清除垃圾,然后继续工作。长时间的停顿看起来就像整个服务器卡死。
症状
- 平均 TPS 正常,但每隔几分钟一切都会冻结 1–5 秒。
- Paper 日志中:
Can't keep up! Did the system time change, or is the server overloaded?— 分析。 spark health显示 GC 所占的时间比例。
影响因素
| 因素 | 影响 |
|---|---|
| 堆大小 | 堆越大 — 停顿越长 |
| 垃圾产生速率 | 在循环中创建对象的插件和模组 |
| 回收器 | 默认使用 G1;ZGC 在大堆上停顿更短 |
| 核心数量 | 并行回收更快 |
该怎么做
- 不要“留出更大余量”地分配内存。 8 GB 就够却给 32 GB,意味着更长的停顿。参考标准是峰值加 30–50% — 需要多少内存。
- 找出垃圾的来源。
spark heapsummary会显示是什么填满了堆。通常是某个特定的插件或模组。 - 参数。 Millida 中已设置好调优的 G1;从网上找来的手动设置往往有害 — Aikar 的参数。
不该做什么
不要试图“禁用垃圾回收器”——它并不作为一个选项存在。不要把 -Xmx 设置得高于套餐的内存容量:进程在试图超出限制时会被杀死 — OutOfMemoryError。
Minecraft 托管您离线时服务器仍在运行创建服务器
