【问题标题】:How to implement a guaranteed finalize behavior of an object如何实现对象的有保证的最终确定行为
【发布时间】:2011-12-20 17:30:19
【问题描述】:

我想在一个对象上实现一个类似于 Java 语言中的保证 finalize() 的行为。我希望在垃圾收集发生之前执行一些语句。请注意 finally 块在这里没有用,因为 finally 在 try 块之后运行,这不是我的要求。基本上我想在对象从 JVM 堆中卸载之前对其进行序列化。请指教。

【问题讨论】:

标签: java finalize


【解决方案1】:

没有办法实现finalize() 方法,无论如何都会被执行,因为 JVM 不能保证调用它。例如,程序退出时留在堆上的对象可能永远不会调用其finalize() 方法,具体取决于当前的 JVM。

一般不建议使用finalize() 来释放除内存以外的任何资源,更不用说除了释放资源之外的任何其他操作。如果您想序列化您的对象,请尝试选择不同的时间点。

good article 总结了您需要了解的关于终结器的几乎所有信息。

【讨论】:

    【解决方案2】:

    你可以在JVM关闭时添加一个钩子;见http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

    与来自@user949300 的幻象一起似乎可行。然而,钩子需要存储对所有对象的弱引用。如果为钩子创建一个 java Service 接口,则可以在对象构造函数中使用它。但丑不是吗?

    【讨论】:

      【解决方案3】:

      我从未使用过 Phantom Reference(听起来像是一部糟糕的星球大战电影),但听起来它可能会奏效。

      “幻像引用对象,在收集器确定它们的引用对象可能会被回收后排队。幻像引用最常用于以比 Java 更灵活的方式调度事前清理操作终结机制。"

      【讨论】:

      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 2012-12-15
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多