System.exit()仅终止JVM进程,不关机;它立即结束程序并返回退出码给OS,仅触发已注册的shutdown hook,真正关机需通过Runtime.exec()调用系统命令,但需权限且风险高。

System.exit 不会实现“自动关机”,它只是终止当前 JVM 进程,和操作系统关机无关。
System.exit 的真实作用
调用 System.exit(int status) 会立即停止 Java 虚拟机,结束当前程序运行,返回指定的退出码给操作系统。它不执行关机命令,也不触发 Windows 的 shutdown 或 Linux 的 poweroff。
- status = 0 表示正常退出
- status ≠ 0(如 1)通常表示异常退出
- JVM 会运行已注册的 shutdown hooks,但之后进程就结束了
如果真想让系统关机,需要调用操作系统命令
Java 本身不能直接关机,但可通过 Runtime.getRuntime().exec() 或 ProcessBuilder 执行系统命令:
- Windows:
shutdown /s /t 0(立即关机) - Linux/macOS:
sudo shutdown -h now或sudo poweroff
注意:这类操作通常需要管理员/root 权限,且不同系统路径、权限策略可能失败,需捕获异常并处理。
立即学习“Java免费学习笔记(深入)”;
结合条件触发关机的典型写法
例如检测到内存严重不足或关键服务不可用时,先警告再关机:
if (isCriticalFailure()) {
System.out.println("检测到致命错误,即将关机...");
try {
if (System.getProperty("os.name").toLowerCase().contains("win")) {
Runtime.getRuntime().exec("shutdown /s /t 0");
} else {
Runtime.getRuntime().exec(new String[]{"sudo", "shutdown", "-h", "now"});
}
} catch (Exception e) {
System.err.println("关机命令执行失败:" + e.getMessage());
System.exit(1); // 至少退出 JVM
}
}
更安全的替代思路
生产环境一般不直接关机,而是:
- 记录日志并通知运维(如发邮件、调用 Webhook)
- 优雅关闭服务(停止线程池、释放资源)
- 用监控系统(如 Prometheus + Alertmanager)统一决策是否关机
- 把 Java 程序作为 systemd 服务或 Windows Service,由外部编排控制
硬编码关机逻辑风险高,容易误触发或因权限失败导致状态不可控。


















