你有没有在任何项目中使用过PhantomReference?

2022-08-31 10:52:41

我唯一知道的是,PhantomReference

  • 如果使用其 get() 方法,它将始终返回而不是对象。它有什么用?null
  • 通过使用,可以确保对象不能从 finalize 方法中复活。PhantomReference

但是这个概念/类有什么用呢?

你有没有在你的任何项目中使用过这个,或者你有什么例子我们应该使用它吗?


答案 1

我在一种简单、非常专业的内存分析器中使用了 s 来监视对象的创建和销毁。我需要他们来跟踪破坏。但这种方法已经过时了。(它是在2004年针对J2SE 1.4编写的。专业的分析工具更加强大和可靠,更新的Java 5功能,如JMX或代理和JVMTI也可以用于此。PhantomReference

PhantomReferences(始终与引用队列一起使用)优于它有一些问题,因此应避免。主要是使物体再次可触及。这可以通过终结器守护者习语来避免(->在“有效的Java”中阅读更多内容)。因此,它们也是新的最终确定。finalize

此外,sPhantomReference

允许您准确确定从内存中删除对象的时间。事实上,它们是确定这一点的唯一方法。这通常不是那么有用,但在某些非常特殊的情况下可能会派上用场,例如操纵大图像:如果您确定应该对图像进行垃圾回收,则可以等到它实际存在后再尝试加载下一个图像,从而使可怕的OutOfMemoryError不太可能。(引自enicholas

正如psd首先写的那样,Roedy Green对参考文献有很好的总结


答案 2

来自 Java 词汇表的一般切块表解释

这当然与 PhantomReference 文档一致:

幻像参照对象,在收集器确定其参照物可能以其他方式被回收后,这些对象将排队。与 Java 终结机制相比,幻像引用最常用于以更灵活的方式调度事前清理操作。

最后但并非最不重要的一点是,所有血腥的细节(这是一本很好的读物):Java参考对象(或我如何学会停止担心并爱出记忆错误)

快乐编码。(但要回答这个问题,我只使用过弱引用。