我想在一个对象上实现一个类似于 Java 语言中的保证 finalize() 的行为。我希望在垃圾收集发生之前执行一些语句。请注意 finally 块在这里没有用,因为 finally 在 try 块之后运行,这不是我的要求。基本上我想在对象从 JVM 堆中卸载之前对其进行序列化。请指教。
问问题
178 次
3 回答
1
没有办法实现无论如何都会执行的方法finalize()
,因为 JVM 不能保证调用它。例如,程序退出时留在堆上的对象可能永远不会调用它们的方法,这取决于当前的 JVM。finalize()
通常不建议使用finalize()
释放除内存之外的任何资源,更不用说释放资源之外的任何其他操作。如果要序列化对象,请尝试选择不同的时间点。
有一篇很好的文章总结了几乎所有你需要知道的关于终结器的知识。
于 2011-12-20T17:44:28.500 回答
0
我从来没有使用过幻影参考(听起来像是一部糟糕的星球大战电影),但听起来它可能会奏效。
“幻像引用对象,在收集器确定它们的引用对象可能会被回收后排队。幻像引用最常用于以比 Java 终结机制更灵活的方式调度事前清理操作。 ”
于 2011-12-20T18:04:05.383 回答
0
您可以在关闭时在 JVM 中添加一个钩子;请参阅http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29
连同来自@user949300 的幻象似乎可行。然而,钩子需要存储对所有对象的弱引用。如果为钩子创建一个 java Service 接口,则可以在对象构造函数中使用它。但丑不是吗?
于 2011-12-20T18:18:13.047 回答