system.exit 是导致 tomcat 闪退的元凶,会强制终止整个 jvm 进程;必须全局排查移除,并改用异常处理、上下文监听器或 tomcat shutdown 端口等安全机制。

不能用 System.exit 解决 Tomcat 闪退问题——恰恰相反,System.exit 是导致 Tomcat 异常退出的元凶之一。
Tomcat 是一个长期运行的 Java 进程,依赖 JVM 持续提供服务。一旦代码中执行了 System.exit(n),JVM 会立即终止整个进程,容器瞬间关闭,表现为“启动后闪退”或“运行中无故宕机”。
官方和生产实践明确禁止在 Web 应用中调用 System.exit,原因包括:
- ✅ Tomcat 的 shutdown hook 机制会响应
System.exit,强制退出; - ✅ 即使是子线程调用,也会终结整个 JVM 进程(不是仅退出当前线程);
- ✅ 在致远OA等集成环境中,已有真实案例证实:业务代码误调
System.exit是引发 Tomcat 突然退出的直接原因(见知识库中2026年1月14日资料第8条)。
所以,正确做法是:
? 排查并移除所有
System.exit(...)调用
全局搜索项目源码、第三方 JAR(如通过grep -r "System.exit" ./webapps/或反编译检查);-
? 禁止用
System.exit做“退出应用”“重启服务”等逻辑
正确替代方式包括:- 抛出受检异常并由 Spring 等框架统一处理;
- 使用
ServletContextListener的contextDestroyed()做优雅清理; - 通过 JMX 或管理端点触发可控的 reload/shutdown(非强制退出);
? 若需模拟“主动停止”,应使用 Tomcat 自带的 shutdown 端口机制
例如向localhost:8005发送SHUTDOWN字符串(前提是server.xml中<server port="8005"></server>未被禁用且未暴露公网),这是安全、可审计的退出方式。
简言之:System.exit 不是解药,是毒药。解决闪退,关键在禁用它、查清它、替换它。











