Java 清理步骤

Posted

技术标签:

【中文标题】Java 清理步骤【英文标题】:Java cleanup step 【发布时间】:2011-03-20 13:27:01 【问题描述】:

在 java 中,我记得有一些方法可以在 jvm 退出或类被销毁时调用,就像一些清理步骤一样?我似乎在任何地方都找不到它叫什么。有人知道它叫什么,我就是找不到它吗?

【问题讨论】:

【参考方案1】:

你可以添加一个shutdown hook,当JVM通过Runtime.addShutdownHook()终止时将被调用。

Runtime.getRuntime().addShutdownHook(new Thread() 
    public void run() 
        // ...
    
);

但是,如果 JVM 异常退出,则不保证会运行关闭挂钩。

正如@Kaleb 指出的那样,您可以重载Object.finalize(),当对象符合垃圾回收条件时将调用它。正如 Josh Bloch 在Effective Java 第 7 条中指出的那样:

终结器是不可预测的,通常很危险并且通常是不必要的

稍低一点(乔希强调):

从一个对象变得无法访问到执行其终结器的时间之间可能需要任意长的时间...... 永远不要在终结器中做任何时间关键的事情。

如果您需要清理类中的资源,请在 finally 块中执行或实现close 方法(或类似方法),而不是依赖finalize()

【讨论】:

你建议实现一个 close 方法,你的意思是这必须显式调用?实际上,我确实有这样的方法,如果这就是您的意思,但是我只想在 finalize 方法中包含另一个检查,以确保例如关闭方法未按应有的方式调用。我正在使用数据库,因此确保连接已关闭很重要,尤其是从长远来看。至少这是我的想法? finalize 的问题在于,无法保证在对象符合垃圾回收条件后它会在多长时间内运行。它可能会使数据库连接打开很长时间,这可能会清空可用连接的连接池并停止对数据库的访问。使用将为您处理这些资源的 API 为您提供更好的服务,例如 spring jdbc。 我明白你的意思,我会去检查spring jdbc,但它是一个项目,所以我需要自己从头开始编写。【参考方案2】:

finalize() 方法在对象被销毁时被调用。

【讨论】:

以上是关于Java 清理步骤的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu系统清理步骤

ovirt系统磁盘删除后清理功能验证步骤

如果维度/事实表中的数据未正确加载,我需要执行哪些步骤来清理数据

TeradataDSA服务器tdactivemq重启清理消息队列步骤

百度小程序缓存怎么清理不掉

markdown 清理未使用的GitHub存储库!在6(半) - 自动步骤中删除所有未使用的存储库和忘记分叉!