Skip to content
托管 · 性能

垃圾回收与卡顿

为什么服务器在 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 在大堆上停顿更短
核心数量并行回收更快

该怎么做

  1. 不要“留出更大余量”地分配内存。 8 GB 就够却给 32 GB,意味着更长的停顿。参考标准是峰值加 30–50% — 需要多少内存。
  2. 找出垃圾的来源。 spark heapsummary 会显示是什么填满了堆。通常是某个特定的插件或模组。
  3. 参数。 Millida 中已设置好调优的 G1;从网上找来的手动设置往往有害 — Aikar 的参数。

不该做什么

不要试图“禁用垃圾回收器”——它并不作为一个选项存在。不要把 -Xmx 设置得高于套餐的内存容量:进程在试图超出限制时会被杀死 — OutOfMemoryError。

Minecraft 托管您离线时服务器仍在运行创建服务器