如何捕获System.exit事件?

问题描述 投票:0回答:3

我有一个java应用程序,其中我尝试确保如果有人退出代码中的System.exit(),则应该调用侦听器来执行一些操作,例如记录消息和释放资源...

我该如何实施它,欢迎任何建议/方法。

java listener
3个回答
54
投票

Runtime.addShutdownHook
方法可用于添加关闭钩子,它基本上是一个未启动的
Thread
,它在Java虚拟机关闭时执行。

但是,这是应该谨慎对待的领域,因为它是在 JVM 生命周期的非常敏感的时间执行的。来自

Runtime.addShutdownHook
方法的 API 规范:

关闭钩子在微妙的时间运行 在虚拟机的生命周期中 因此应该编码 防守地。他们应该,在 特别地,可以写成 线程安全并避免死锁 尽可能。

无论如何,请务必阅读一些有关关闭挂钩如何工作的信息,因为如果没有做好充分的准备,可能不应该接触它们。请务必仔细阅读

Runtime.addShutdownHook
方法的 API 规范。

以下是我在搜索此答案的信息时发现的几篇文章:


7
投票

函数

Runtime.addShutdownHook(Thread thehook)
允许您将钩子注册到 Java 虚拟机中。
该钩子作为一个已初始化但未启动的线程工作,它将在退出时由 JVM 调用。如果您注册多个钩子,请注意调用钩子的顺序是未定义的。


0
投票

您还可以使用 JFR 录制,

jdk.Shutdown
事件默认启用=true,stackTrace=true。因此,使用
jfr print --verbose --events jdk.Shutdown --stack-depth 20 recording.jfc
将显示调用者堆栈跟踪。

执行此操作的最小记录是(为了可读性而换行):

java -XX:StartFlightRecording:settings=none,filename=recording.jfr, \
  +jdk.Shutdown#enabled=true,+jdk.Shutdown#stackTrace=true \
  SelfExit.java
© www.soinside.com 2019 - 2024. All rights reserved.