我想在一个对象上实现一个类似于Java语言中保证的finalize()的行为。我希望在垃圾收集发生之前执行一些语句。请注意,finally块在这里没有用,因为最后在try块之后运行,这不是我的要求。基本上我想在从JVM的堆中卸载之前序列化对象。请指教。
答案 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接口,则可以在对象构造函数中使用它。但丑陋不是吗?