如何实现对象的保证最终化行为

时间:2011-12-20 17:30:20

标签: java finalize

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

3 个答案:

答案 0 :(得分:1)

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

通常不建议使用finalize()释放除内存之外的任何资源,更不用说除了释放资源之外的任何其他资源。如果要序列化对象,请尝试选择其他时间点。

总结了good article几乎所有关于终结器的知识。

答案 1 :(得分:0)

我从来没有使用幻影参考(听起来像是星球大战中的一部坏电影),但听起来它可能就是这样。

“幻影引用对象,在收集器确定其对象可能被回收之后排队。幻像引用最常用于以比Java更灵活的方式调度预先清理操作最终确定机制。

答案 2 :(得分:0)

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

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