我的世界服务器需要多少内存?
大多数 Paper 服务器用 3 到 8 GB 堆内存就够了:几个朋友一起玩 3 或 4 GB,20 到 30 名玩家加一套常规插件 5 或 6 GB,超过 50 名玩家 8 GB 或更多。你租的套餐要比这个稍大一些,因为 Java 在堆内存之外也要用内存。
| 在线玩家 | 插件 | 最低 | 推荐 | 套餐或容器 |
|---|---|---|---|---|
| 5 | 10 | 2 GB | 3 GB | 4 GB |
| 10 | 15 | 3 GB | 4 GB | 5 GB |
| 20 | 25 | 3 GB | 5 GB | 6 GB |
| 30 | 40 | 4 GB | 6 GB | 7 GB |
| 50 | 50 | 5 GB | 8 GB | 10 GB |
| 100 | 80 | 8 GB | 13 GB | 15 GB |
上面的计算器会用你的数字做同样的计算。请把结果当作起点:实际占用取决于玩家分布得多散、视距大小以及每个插件做了什么。
估算是怎么算出来的
计算器累加的是堆内存,也就是 Java 分配给 Minecraft 的内存(用 -Xmx 设置的那个):
- 基础 2 GB:Paper 或 Purpur 加载好世界、没有人在线时的占用。Folia 从 3 GB 起步,因为它是为分散在地图各处的大量玩家设计的。
- 每名同时在线玩家 75 MB。 每名玩家都会让周围的区块保持加载,连同其中的生物和物品。分散在世界各地的玩家比聚在大厅里的玩家占用更多。
- 每个插件平均 40 MB。 大多数插件用得少得多,少数插件用得多得多。
- 重型插件或大地图再加 2 GB: 网页地图(Dynmap、BlueMap)、自定义模型(ItemsAdder、ModelEngine)、大量生物或农场,或视距超过 10。
- 1.8 到 1.11 按总量的四分之三计算,因为这些版本的区块更轻。
结果向上取整到整数 GB,并且不低于 3 GB(1.8 到 1.11 为 2 GB)。最低值约为它的三分之二:服务器能运行,但应对繁忙时段、生成新区块或备份的余地很小。计算器最高到 31 GB,因为超过大约 32 GB 时 Java 会关闭压缩对象指针,稍微超过一点反而可用内存更少。
这些数字是有意往高估的。内存不够会让服务器先卡顿再崩溃,而稍微多一点只是每个月多花一点钱。
给 Java 留出余量:堆内存与套餐
-Xmx 只限制堆内存。Java 还要用内存存放每个插件的类、它的线程、编译后的代码、网络缓冲区以及垃圾回收器自己的记录。计算器为此预留 1 GB 或堆内存的 15 %,取两者中较大的值,这和 Paper 的建议一致:-Xmx 要比你拥有的内存少 1000 到 1500 MB。实际来说:
- 租用套餐: 按计算器显示的套餐大小来选,而不是堆内存。8 GB 堆内存需要 10 GB 的套餐。
- 已经有套餐: 把它填进你的套餐内存,参数会按能装进套餐的大小设置。8 GB 的套餐留出 6.5 GB 堆内存。
- Pterodactyl、Docker 和大多数主机限制的是整个容器。如果 Java 超出限制,服务器会被当场杀掉,控制台里往往没有任何报错。
- 你自己的电脑或 VPS: 要给操作系统和其他运行中的程序留出内存。
为什么 -Xms 等于 -Xmx
Aikar 参数把 -Xms 和 -Xmx 设为相同的值,并加上 -XX:+AlwaysPreTouch,在服务器启动时就预留整个堆内存。G1 在堆内存不扩大也不缩小时工作得更好,而且如果内存实际上不存在,你在启动时就会发现。一个副作用是:面板的内存图从第一分钟起就显示整个堆内存都在使用。这是正常的。
Aikar 参数与 ZGC
Aikar 参数针对 Minecraft 使用内存的方式调优 G1 垃圾回收器:大量只存活一个 tick 的对象,以及必须保持很短的停顿。Paper 推荐使用它们,适合任何规模的服务器。堆内存超过 12 GB 时,计算器会改用 Aikar 针对大堆内存的取值:G1NewSizePercent=40、G1MaxNewSizePercent=50、G1HeapRegionSize=16M、G1ReservePercent=15 和 InitiatingHeapOccupancyPercent=20。
ZGC 是另一种垃圾回收器,几乎所有工作都在服务器继续运行时完成,所以停顿能保持在一毫秒以内。代价是它占用更多 CPU,只有在有空闲核心的大堆内存(16 GB 及以上)上才有意义。请使用分代版本:在 Java 21 上需要 -XX:+ZGenerational,从 Java 23 开始它是默认模式,所以计算器不会加上这个参数。如果拿不准,就继续用 G1。
用哪个 Java 版本
| Minecraft | Java |
|---|---|
| 26.1 及以上 | 25 |
| 1.20 – 1.21.11 | 21 |
| 1.17 – 1.19.4 | 17 |
| 1.16.5 | 16 |
| 1.12 – 1.16.4 | 11 |
| 1.8 – 1.11 | 8 |
这是 Paper 文档中的表格。用 java -version 查看你装的是哪个版本。如果装了多个,脚本会启动 java 命令指向的那个。
启动服务器
- 填写玩家数、插件数、服务端和版本,如果已经有套餐,再填上套餐内存。
- 选择一个启动脚本:
- start.sh 用于 Linux 和 macOS。保存在 jar 旁边,先执行一次
chmod +x start.sh,然后运行./start.sh。 - start.bat 用于 Windows。保存在 jar 旁边,双击运行。末尾的
pause会在服务器停止时保持窗口打开,方便你看报错。 - Pterodactyl 给出启动命令,其中的
{{SERVER_JARFILE}}由面板填入 jar 文件名。然后在面板中把服务器内存设为不低于套餐大小。 - 仅参数适用于有 JVM 参数栏的主机。如果主机自己设置内存,请删掉
-Xms和-Xmx。
- start.sh 用于 Linux 和 macOS。保存在 jar 旁边,先执行一次
- 点击复制。复制分享链接会把你的设置保存在链接里。
什么时候加内存也没用
卡顿通常来自 CPU:普通服务器的大部分工作都在一个主线程上完成,所以更快的单核比更多的内存更有用。升级之前,先运行 /spark health 查看内存和 TPS,再用 /spark profiler 看看时间花在了哪里。从 1.21 起 Paper 自带 spark。调低 view-distance 和 simulation-distance 能同时节省内存和 CPU;用 Chunky 这类插件预生成世界,可以避免玩家游玩时生成新区块造成的卡顿峰值。