服务器跑了两小时,你切回桌面回了条消息,再打开 Minexa,状态变成“未运行”。点启动,世界进不去,终端刷出一段英文堆栈。这是最让人慌的时刻,也是新手最容易把小问题搞成删档的时刻。
慌的时候最常做的三件事恰好都是错的:反复点启动、直接删 world 文件夹、用“存档修复大师”改原文件。反复启动会让服务端在半截文件上继续写,后两个会把还能救的数据彻底弄没。
下面按真实顺序来:先判断这算不算崩溃,再保住存档,最后才读报告、修文件。正卡在“世界打不开”的可以直接跳到「存档坏了:五种表现」。
“突然没了”有四种:崩溃、被系统杀、正常退出、卡死。方向完全不同,别一律当崩溃处理。
记牢这个顺序:先停手,再备份,最后才修。反过来做一次就可能删档。
崩溃报告在「更多 → 崩溃报告」,读法是从 最后一个
Caused by:往回看。世界还原没有二次确认,点一下立刻覆盖,还原前必须先自己备份一次。
自动备份默认是关的(间隔 0),没开就等于没有备份。
先分清四种“没了”:崩溃、被杀、正常退出、卡死#
先给结论:只有真的崩溃才需要读崩溃报告。判断错方向,后面所有努力都白费。
| 现象 | 本质 | 有没有报告 | 怎么确认 |
|---|---|---|---|
| 终端刷出英文堆栈后退出 | JVM 或核心真的崩了 | 有,带 at ... 堆栈 | 报告里能找到 Caused by: |
| 界面回到桌面,状态自己变未运行 | 被 Android 低内存杀手或厂商清理杀掉 | 通常没有 Java 异常 | 报告开头写 退出码: 137 |
| 你点了停止,或手机重启 | 正常退出 | 没有新条目 | 报告列表里没有这次 |
| 显示“运行中”但玩家全掉线、终端不动 | 主线程卡死,被看门狗终止 | 有 Watchdog 片段 | 日志出现 The server has not responded |
应用是怎么判定“崩溃”的#
报告内容可能和你的直觉不一致。Minexa 不看日志里有没有 ERROR,只看两个硬条件:
退出码不是 0 → 一律算异常退出,生成崩溃报告;
退出码是 0,但退出发生在启动后 20 秒内 → 也算异常,因为“启动阶段就退出”不是正常结束;
退出前 5 分钟内你点过停止 → 一律按正常停止处理,既不生成报告,也不自动重启。
所以“明明看到一堆红字,却没有崩溃报告”通常只有两种解释:进程被系统杀了(没走到 Java 异常),或者你刚点过停止。
退出码是进程结束时留给系统的一个数字。0 表示“我自己正常结束”,非 0 表示“我出事了”。137 在 Linux 和 Android 上通常代表进程被强制杀死(信号 SIGKILL)。报告开头会把 137 解释成“通常表示 SIGKILL”,但那只是提示,137 不等于一定是内存不足,也可能是厂商省电策略直接干掉。
崩了先别点启动:三步保住现有存档#
崩溃后世界可能正处在“写了一半”的状态:区域文件只写了一半、level.dat 还没更新。这时候立刻重启,等于在损坏的文件上继续覆盖写。
确认真的停了:回「概览」,状态必须是“未运行”。如果还显示运行中但完全没反应,点「强制停止」——它有二次确认,确认后可能丢失未保存的数据。
先做一次整服备份:「更多 → 世界与备份」,在「外部备份」区点「备份整个服务器」。备份不会停服,不会动你现有文件。
再把世界单独留一份:同一页点「备份世界」;或去「文件」页把
world、world_nether、world_the_end分别导出(目录会自动打成 zip)。
备份落在 /storage/emulated/0/世界与服务器的备份/,卸载也不会丢。第一次进这页会引导你授予“所有文件访问”,没授权时备份按钮是灰的。
世界还原和整服还原都没有二次确认:点下去立刻停服、立刻用备份内容覆盖当前世界。没有“确定吗”,也没有撤销键。顺序永远是「先备份,再还原」。整服还原成功后还会把旧目录直接删掉——连后悔药一起删。只有“目标目录重名”时会弹提示,那是冲突提醒,不是还原确认。详见 备份、还原与世界管理。
崩溃报告在哪,为什么有的是空的#
入口就一个:「更多 → 崩溃报告」,列表按时间倒序。报告有两个来源,这就是“为什么有两条”的原因:
应用自建的:
crash-logs/crash_yyyyMMdd_HHmmss.txt,异常退出时生成,含退出码、关键片段和最后 800 行日志;核心原生的:各服务端目录里的
crash-reports/crash-<日期>_<时间>-server.txt,由服务端自己写。
点开一条报告,里面有三个标签:
| 标签 | 里面是什么 | 什么时候看 |
|---|---|---|
| 摘要 | 「退出码: N」、逐条 Caused by:、应用给的“标签 + 建议” | 先扫一眼,30 秒判断方向 |
| 原始报告 | 核心写的那份原文 | 摘要说“未能明确归因”时 |
| 完整日志 | 本次运行的最后 800 行 | 要贴给别人求助时 |
页面顶端有一句固定的红色提醒,值得照做:求助时不要只发摘要,直接把「完整日志」整段发出去。摘要里的结论是猜的,完整日志里才有上下文。
还要留意:「latest.log 不存在」说明服务端一次都没输出过,多半启动命令就没跑起来;「存在但为空」说明进程起来了立刻死了,方向在启动参数或核心文件上。
「暂无崩溃报告」通常意味着这次退出没走到 JVM 层。别反复重装,去看概览页状态提示和「终端」最后一屏。终端最多显示 300 行、单行超 400 字符会截断,先点「复制当前日志」再慢看。见 终端与快捷指令。
读报告的顺序:别从第一行读#
堆栈几十行,按这四步读,两分钟能定位:
找最后一个
Caused by::异常层层包裹,最外层往往是“启动失败”这类没信息量的话,最后一个Caused by:才是根因。找第一处带你插件/模组名字的
at ...:那是触发点。全是net.minecraft.*就说明是核心自身的问题,不是插件。看异常类型:
OutOfMemoryError、StackOverflowError、NoClassDefFoundError、Mixin apply failed,每一类对应完全不同的处理。看时间点:启动时就崩,和跑了三小时才崩,是两种病。
报告里常见的形状(类名和行号每个人都不一样,只看结构):
java.lang.OutOfMemoryError: Java heap space
at net.minecraft.server.level.ServerLevel.tick(ServerLevel.java)
Caused by: java.lang.OutOfMemoryError: Java heap space读法是:第一行说“堆内存用完了”,Caused by: 再确认一遍。结论不是“核心有 bug”,而是堆不够用或有人在泄漏,下一步去 内存不足与 CPU 占用过高。
常见崩溃:一眼对照#
| 报告里的原文片段 | 真正的问题 | 先做什么 |
|---|---|---|
OutOfMemoryError: Java heap space | 堆内存真的用完 | 降视距、清实体,再考虑加 256 MB |
OutOfMemoryError: Metaspace | 类元数据区满(上限固定 256 MB) | 减模组,别加堆 |
StackOverflowError | 递归太深,常见于模组互相调用 | 卸掉最近加的模组 |
Mixin apply failed | 两个模组改了同一个游戏类 | 其中一个换版本,或二选一 |
NoClassDefFoundError / NoSuchMethodError | 缺依赖,或依赖版本对不上 | 看第一个异常涉及的 jar |
The server has not responded for ... seconds | 看门狗判定主线程卡死,常见于实体/红石过多 | 看 Server thread dump 卡在哪 |
Failed to load level / level.dat | 世界存档坏了 | 见本页下一节 |
开了日志汉化,一行显示成「中文摘要 + 原文」。搜索和求助搜英文那半句。
存档坏了:五种表现,五个方向#
世界损坏不是一种病,先看日志怎么说,再决定动什么。
| 日志里的表现 | 坏在哪 | 还能救吗 | 动作 |
|---|---|---|---|
Failed to load level + level.dat | 世界元数据损坏或丢失 | 多数能救 | 从备份还原;没备份只换 level.dat |
Region file 报错 / 文件被截断 | 单个 region/*.mca 写坏了 | 常常能救 | 只回滚那一个区域文件 |
Chunk file at ... is missing | 单个区块丢了 | 能救 | 备份后启动,会自动重新生成 |
| 世界能进,但地形切掉一块、箱子空了 | 区块回档 | 部分能救 | 还原到损坏前时点的备份 |
卡在 Preparing level 后退出 | 世界根本读不进去 | 看上面四种 | 先把整个世界导出留底再动手 |
不管哪一种,第一条动作都一样:先导出整个世界留底,再动任何文件。「文件」页的导出会把目录打成 zip,几分钟的事,却是唯一的退路。
抢救顺序:从备份还原(最稳的一条路)#
停服:概览点「停止」。它会发
stop命令并最多等 180 秒;超时不会强杀,而是提示你可以点「强制停止」。把当前状态再备份一次:哪怕它是坏的,你要靠它对比哪一步改坏了。
还原:「更多 → 世界与备份」→ 在外部备份列表里找时间最近、大小正常的那条 → 点「还原」。
立刻启动验证:终端出现
Done (…s)! For help, type "help"才算成功,光看到“运行中”不算。进游戏抽查:出生点、你最后待的地方、下界和末地各传送一次,三处都能进才算救回来了。
还原时应用会先把旧维度目录改名成 world.bak.<时间戳> 再解压;解压失败或解出来没有世界,它会删掉半成品并把 .bak 改回原名,即自动回滚。那些 .bak 是最后的后悔药,确认新世界没问题前别删。
没有备份时还能做什么#
按风险从低到高排:
先做原始副本:用「文件」页把整个世界目录导出到手机另一位置。后面所有操作都在副本上做,不碰原目录。
只换
level.dat:用同版本、同核心新建一个空服务器,拿它新生成的level.dat覆盖过来,region/等目录保持原样。代价是种子、世界名、游戏规则回默认值。只回滚单个区域文件:
region/里的文件名是r.<x>.<z>.mca,坐标能从日志里读出来,只拿这一个覆盖回去最安全。--forceUpgrade(谨慎):Minecraft 通用做法——启动时加这个参数,让服务端尝试升级旧格式世界。Minexa 没为它做开关,要在启动设置里打开「使用自定义启动命令」自己写。它只对“版本升级后打不开”有效,对文件损坏无效,而且升级不可逆,只在副本上试。第三方修复工具(不推荐新手用):这类工具大多直接改写原文件,第一次没修好,第二次连原始数据都没了。
你已经因为一次异常关闭丢了数据,再让来路不明的程序覆盖一次,通常就是彻底没了。要试,先把整个世界目录复制到别处,在复制品上试。
用 1.16 的服务端去开 1.21 的世界,日志会说这个世界是“用更新的版本保存的”(newer version),然后加载失败。这不是修一下就好的损坏:新方块和新区块格式旧版读不懂。唯一干净的做法是换回原版本,或用升级前的备份。
防复发:现在就做的五件事#
| 做什么 | 在哪做 | 为什么能防住 |
|---|---|---|
| 打开自动备份(默认关闭、间隔 0),保留 10 份 | 世界与备份 → 自动备份 | 九成存档问题靠回滚就能解决 |
| 换核心、升大版本前整服备份 | 同页「备份整个服务器」 | 这几步最容易写坏世界 |
| 服务端运行时不要删、不要换世界目录 | — | 文件页的删除和编辑不检查服务端是否运行 |
模组/插件一次只加一个,看到 Done 再加下一个 | 插件/模组页 | 出问题立刻知道是谁干的 |
| 手机留至少 2 GB 空闲存储 | 系统设置 | 存储写满时存档可能只写一半 |
自动备份只在服务端运行时每 60 秒检查触发,且需要“所有文件访问”权限——服没开时不会帮你备份。运行中备份拿到的是“当时磁盘上的文件”,动大手术前先停服再备份。长期开服配合 备份策略。
概览状态是“未运行”,而且你已经做过至少一次整服备份。
「更多 → 崩溃报告」里能找到这次退出,摘要里有一行「退出码: N」。
你能说清这次是崩溃(有
Caused by:)还是被杀(退出码 137、没有 Java 异常)。服务端目录里如果出现
world.bak.<时间戳>,你还没有删它。重启后终端出现过
Done (…s)! For help, type "help",不是停在Starting server。自动备份的间隔不是 0,或者你清楚知道自己没开、并在手动备份。
下一步#
报告里出现模组名或
Mixin:模组冲突与插件报错报告里是内存或卡死:内存不足与 CPU 占用过高
进都进不去、还没到读报告那一步:启动失败排查