2

我没有使用 PhantomReferences。实际使用的好例子似乎很少。

当一个幻影出现在您的队列中时,您如何知道它是/曾经是哪个对象?get() 方法似乎没用。根据JavaDoc

因为幻影引用的所指对象始终不可访问,所以此方法始终返回 null。

我认为,除非您的对象是单例,否则您总是希望使用 PhantomReference 的子类,您可以在其中放置您需要的任何纪念品,以了解死亡的原因。

这是正确的,还是我错过了什么?

这对于 SoftReferences 也是如此吗?对于弱引用?

指向相关使用示例的链接会很棒。

4

2 回答 2

1

我认为,除非您的对象是单例,否则您总是希望使用 PhantomReference 的子类,您可以在其中放置您需要的任何纪念品,以了解死亡的原因。

您还可以使用 aMap<Reference<?>, SomeMetadataClassOrInterface>来恢复您需要的任何元数据。由于ReferenceQueue<T>返回 a Reference<T>,您要么必须将其转换为PhantomReference您期望的任何子类,要么让 aMap<>为您完成。

就其价值而言,使用 PhantomReferences 似乎会给您带来一些负担:

与软引用和弱引用不同,幻像引用在排队时不会被垃圾收集器自动清除。通过幻像引用可访问的对象将保持不变,直到所有此类引用都被清除或自身变得不可访问。

所以你必须clear()自己参考引用才能回收内存。(为什么必须这样做而不是让JVM为你做这件事是有用的,这超出了我的理解)

于 2011-10-10T15:28:25.257 回答
1

您的问题使我对其进行了更多研究,并且我发现了这个写得很好的解释和所有参考类型的示例。他甚至谈到了幻象引用的一些(微不足道的)用途。

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

于 2011-10-08T02:00:12.583 回答