public static void exit(int status)
System.exit(status) 用於終止當前運行的 Java 虛擬機 (JVM)。參數 status 為退出狀態碼:
底層調用 Runtime.getRuntime().exit(status),該方法永不正常返回。
調用 System.exit() 會觸發 JVM 關閉序列,包含兩個階段:
Shutdown Hook(Runtime.addShutdownHook(Thread)),允許它們併發運行直至結束。runFinalizersOnExit(已過時),運行所有未被調用的 finalize() 方法。完成後 JVM 停止。若在關閉序列已開始時再次調用 exit(),會阻塞或導致異常行為。
if (businessSuccess) {
// 釋放資源、關閉連接池、刷新日誌...
System.exit(0); // 告知操作系統/調度系統:任務成功
}
try {
// 核心業務邏輯
} catch (Exception e) {
log.error("致命錯誤,進程即將退出", e);
// 可在此註冊關閉鉤子做兜底清理
System.exit(1); // 非零碼,標記異常退出
}
在 Docker/K8s 中,容器的重啟策略、健康檢查、Job 完成判斷完全依賴進程退出碼:
exit 0 → 任務成功,K8s Job 標記 Complete;Deployment 不重啟。exit 1 (或其他非零) → 任務失敗,K8s 根據 restartPolicy 決定重啟或標記 Failed。System.exit() 會立即殺死進程。事實: 會等待所有非守護線程結束,並執行關閉鉤子。若鉤子死鎖,進程將掛起不退出。SpringApplication.exit()),否則導致資源洩漏、端口未釋放。SecurityManager,需 checkExit(status) 權限,否則拋出 SecurityException。System.exit(0) 與 System.exit(1) 的本質區別在於向作業系統及上層調度系統傳遞的語義信號。正確使用退出碼,配合關閉鉤子做資源兜底清理,是構建健壯、可運維 Java 應用的關鍵細節。