服务器玩着玩着卡成幻灯片,或者干脆崩出一段 OutOfMemoryError。绝大多数人的第一反应是“内存调大”,但内存和 CPU 是两条不同的线:调错了,卡顿不会消失,反而可能让系统更早把服务端杀掉。
还有一种更容易搞错的情况:手机烫了、电量低了,系统自动降频,服务端什么都没做错,TPS 却一路往下掉。这时候你去加内存、删插件,全是白费。
这一页只做一件事:帮你判断现在到底是内存问题、CPU 问题,还是两者都不是。判断对了,处理动作通常只有一两个。
先看两个数字:概览的内存条和 TPS。TPS 满分 20,低于 18 才开始能感觉到卡。
内存上限不是越大越好,不要超过手机可用内存的 60%,否则系统会先杀掉服务端。
OOM 有三种:
Java heap space、Metaspace、GC overhead limit exceeded,处理方向各不相同。没有 OOM、进程直接消失的“崩溃”,是被系统杀的,加内存只会让它更早发生。
越玩越卡、还发烫,先怀疑降频,不是服务端的锅。
先看两个数字,再决定查哪边#
打开「概览」,看两处:
内存条:格式是「已用 / 上限」,上限就是你设的 JVM 内存上限(
-Xmx)。未运行时显示-- / 上限。TPS:服务器每秒能完成多少个游戏刻,满分 20。低于 18 就会开始有感觉,掉到 10 以下基本没法玩。
再看手机本身:是否插着电、机身烫不烫、后台还有没有别的应用、最近有没有装新插件/模组/新地图。这四条能解释掉一半的“莫名其妙变卡”。
堆内存是 Java 服务端放游戏对象的那块内存,由 -Xmx 限定上限,满了就 OutOfMemoryError。TPS(ticks per second)是服务端每秒能跑完多少个游戏刻,20 是满分;它掉下来,玩家看到的就是方块回弹、怪物瞬移、开箱子要等半秒。
“卡”有三种,先问清是哪一种#
玩家说“卡”,可能是三件完全不同的事。分不清就动手,等于蒙着眼睛修车。
| 玩家的说法 | 真实原因 | 怎么确认 |
|---|---|---|
| 方块回弹、怪物瞬移、挖了不掉 | 服务端 TPS 低 | 概览的 TPS 低于 18 |
| 走路一顿一顿,但挖方块立刻有反应 | 客户端帧率低 | 别人不卡、只有他卡 |
| 开箱子要等、聊天延迟、进服转圈久 | 网络延迟/丢包 | TPS 正常,只有远程玩家卡 |
第一种归这一页管;第二种让对方调客户端画质和视距;第三种去看 联机排错。先分清,再动手,这比任何优化都省时间。
内存问题:三种 OOM,方向完全不同#
| 报错 | 含义 | 常见原因 | 处理 |
|---|---|---|---|
Java heap space | 堆内存用完 | 人数多、视距大、实体多、泄漏 | 降视距、清实体,再加 256–512 MB |
Metaspace | 类元数据区满 | 模组多、动态生成类多 | 减模组;加堆没用 |
GC overhead limit exceeded | GC 花太久却回收不出空间 | 堆太小,或对象几乎都活着 | 查泄漏,再考虑加内存 |
堆内存 OOM:最常见,也最容易调错#
如果内存条长期贴着上限、TPS 同时下降,加内存通常有效。但要守住两条:一次只加 256 MB,并且上限不要超过手机可用内存的 60%。具体到机型的推荐值见 内存分配。
如果内存条根本没满就 OOM,或者刚启动就 OOM,那不是“给少了”,而是别的问题:
新装模组/插件之后开始:先卸掉它,八成是它一次性加载了太多东西;
世界很大、一有人进服就 OOM:预生成地图或降视距,别急着加内存;
实体和掉落物堆积:清一遍实体,检查刷怪塔、漏斗、掉落物没被捡走的地方。
内存条是「已用 / 上限」,重点不是某一刻的读数,而是它的走势。每两三分钟瞄一眼:
涨上去又掉下来(锯齿状)→ 正常的 GC 循环,不用管;
一路缓慢上涨,GC 后也回不去→ 典型的泄漏,先怀疑最近装的模组/插件;
一开服就贴着上限→ 是给少了,按 256 MB 一档往上加。
观察时别一边看一边改配置:-Xmx 是启动参数,改完必须重启才生效,运行中在启动设置里是改不动的。
Metaspace OOM:加堆内存没用#
-Xmx 管不到 Metaspace。Minexa 启动 Java 服务端时把 Metaspace 上限固定成了 256 MB,界面上不能调。所以遇到 OutOfMemoryError: Metaspace,唯一有效的方向是减少模组和动态类数量,给再多堆内存也不会好转。
被系统杀:没有 OOM 的那种“崩溃”#
服务端直接消失、崩溃报告是空的、日志里没有任何 Java 异常——这是被 Android 的低内存杀手(LMK)或厂商清理杀掉了。此时加内存只会让系统更早动手,因为你要的内存本来就不存在。
按顺序检查:
JVM 内存上限是否超过了设备内存的 60%;
是不是锁屏之后一段时间才消失;
电池优化有没有关掉、有没有开省电模式;
后台是不是还挂着游戏、浏览器、视频。
对应处理在 后台保活,那里讲了哪些能改、哪些只能靠系统放行。
CPU 高:先分清整机忙还是单核忙#
手机 CPU 是手机服的真正瓶颈,尤其是单核性能。Minecraft 的主逻辑基本跑在一个线程上,所以八核手机也不会因为核多就变快——这点和电脑玩家的直觉相反。
还有一种“看起来是 CPU 问题”的情况:手机发热降频。表现为开服前 20 分钟很流畅,之后越来越卡,摸上去烫手,插着电也不见好。这时候看 TPS 会看到缓慢下滑,但内存条很平稳。先降温、摘掉厚壳、别边充边玩,比改任何配置都有效。
Minexa 不提供 CPU 火焰图或 tick 明细。要精确定位到某个插件/模组,得自己装 spark 这类工具用它自己的命令采样——这属于通用 Minecraft 运维,不是应用功能。不想装工具也有办法:用二分法卸一半插件,看卡顿是否消失,再逐步缩小。方法在 模组冲突与插件报错。
TPS 低的六类原因#
内存正常但 TPS 低,就看这六项:
| 原因 | 表现 | 怎么确认 | 处理 |
|---|---|---|---|
| 区块生成 | 新玩家跑图时突然卡 | 有人往新方向跑就掉 TPS | 预生成、降视距 |
| 实体过多 | 特定区域卡 | 靠近某个刷怪塔/村庄就卡 | 清理实体、限制刷怪 |
| 红石/漏斗 | 基地附近卡 | 人离开那片区域就恢复 | 减少高频红石、漏斗 |
| 插件/模组 | 装完就开始卡 | 二分法卸载 | 换轻量替代 |
| 手机降频 | 越玩越卡、发热 | 温度高,插电也没改善 | 散热,别边充边玩 |
| Java/核心不匹配 | 启动就慢、一直卡 | 版本对不上 | 换正确的 Java 或核心 |
一张判断表:先对号,再动手#
| 内存条 | TPS | 更像 | 先做什么 |
|---|---|---|---|
| 长期贴近上限 | 低 | 内存不足或泄漏 | 降视距,查最近装了什么 |
| 很低 | 正常 | 给太少了 | 加 256 MB,观察一晚 |
| 正常 | 低 | CPU / 实体 / 区块 | 查实体、预生成、二分插件 |
| 正常 | 正常但玩家喊卡 | 网络或客户端 | 看延迟、让对方调画质 |
| 进程直接消失 | — | 被系统杀 | 降内存上限、关电池优化 |
处理顺序:六步,别跳步#
顺序很重要,因为前面的步骤会改变后面的判断依据。
先降温、插电、关省电:降频会让所有优化失效,先排除它。
降视距和模拟距离:收益最大、风险最低,改完重启才生效。见 视距与模拟距离。
清理实体和掉落物:先备份,再清。清完观察 10 分钟 TPS。
二分插件/模组:一次卸一半,别一次卸光——卸光了就不知道是谁。
调内存上限:每次 256 MB,跑一晚再看。一次从 1024 跳到 4096,出问题你不知道是哪一步。
预生成世界:最后做,最耗时,但能一次性解决跑图卡顿。
每一步都要留下“改之前”和“改之后”的对比。没有对比,你只是在收集心理安慰。
什么时候该认输:减人数、降视距、换设备#
有些瓶颈不是优化能解决的。手机服的物理上限大概是这样(原版/Paper + 少量插件,经验值):
| 手机内存 | 建议人数上限 | 内存上限 | 视距 |
|---|---|---|---|
| 3 GB | 1~2 人 | 768~1024 MB | 6 |
| 4 GB | 2~3 人 | 1024~1536 MB | 6~8 |
| 6 GB | 3~5 人 | 1536~2048 MB | 8 |
| 8 GB | 5~10 人 | 2048~3072 MB | 8 |
超过这个规模还硬撑,结果一定是又卡又烫、存档还容易写坏。模组服、大型整合包要在这个基础上再往下调。综合优化清单见 让手机服稳定运行。
这类应用会主动杀后台进程,很可能连服务端和它的前台服务一起杀;它们“清理”完还会制造更多 GC 压力。Android 的内存管理不需要你手动干预,真正该做的是把 Minexa 加进电池优化白名单。
概览的内存条能读出「已用 / 上限」两个数字,不是
--。TPS 显示在 18 以上,或你已确认掉 TPS 的具体时段和动作。
内存上限没有超过手机可用内存的 60%。
崩溃报告里如果是
OutOfMemoryError,你能说出是哪一种(heap / Metaspace / GC overhead)。手机不烫、不在充电,后台没有别的重应用。
你已经按「先降视距、再调内存」的顺序做过一次,而不是同时改了三项。
下一步#
内存该给多少:内存分配
TPS 和 MSPT 怎么看:TPS 与 MSPT
越玩越卡的整体优化:让手机服稳定运行