退出代码不是崩溃原因,它只是一声无奈的摊手
那个数字什么都说明不了。它上面那一行才说明一切,而那一行早就躺在你的日志文件夹里了,举例来说,退出代码 137 通常并不是崩溃,而是操作系统因为内存不足才强行终止了这个进程,并不是程序本身出了什么问题。
一个 Java 服务器挂掉时会打印 Exit Code 1 然后停止。这就是全部信息。退出代码 1 的意思是“进程异常结束”——它是一个分类,不是原因,它涵盖的范围从缺失的世界文件夹到在类加载期间抛异常的模组,无所不包。
真正的答案在哪里
退出代码是由你的启动器或主机面板打印的,不是游戏本身。原因在 logs/latest.log 里,如果是崩溃的话,还在服务器保存于 crash-reports/ 下的报告中。从日志末尾往前读,直到你遇到第一个 Exception、Caused by: 或 Failed to。那一行会指出类名、模组或文件。
[Server thread/ERROR]: Encountered an unexpected exception
java.lang.NoSuchMethodError: net.minecraft.world.level.Level.getBiome
at com.example.mod.ExampleMixin.inject(ExampleMixin.java:41)
Caused by: java.lang.NoClassDefFoundError: com/example/lib/Helper
这里的 NoClassDefFoundError 是缺失依赖,不是世界损坏。退出代码对这些只字未提。
你实际会遇到的退出代码
| 代码 | 通常含义 |
|---|---|
| 0 | 正常关闭——/stop 或计划重启 |
| 1 | 看门狗杀死了卡住的 tick,JVM 拒绝启动,或者启动器或模组加载器报告了崩溃 |
| 137 | 被操作系统杀死,几乎总是 OOM killer |
| 143 | SIGTERM——容器编排器停止了它 |
代码 137 是常被人误读为崩溃的那个。JVM 并没有失败;是它外部的某个东西认定该进程占用了过多内存。
Java 和 Bedrock 不是同一个问题
Bedrock 的专用服务器是另一个程序,有它自己的日志记录方式,针对 Java 日志写的建议套不到它身上。
模组堆栈的失败方式不一样
装了模组之后,第一个异常往往只是症状。一个 mixin 应用失败会产生连锁反应,真正的元凶是第一条 Mixin apply failed 行,而不是三十行之后的 NoSuchMethodError。在搜索 Exception 之前,先在日志里搜 Mixin。
检查服务器是否在线
日志告诉你它为什么挂了。它不会告诉你它现在是否还活着。对服务器端口做一次状态查询,一个请求就能回答这个问题。这里的工具检查的是 Java 服务器;Bedrock 走 UDP,需要它自己的查询方式。
把日志粘贴到 服务器诊断 工具里,就能把出错的那一行提取出来,再把工具指向你的主机,确认服务器是否真的在响应。