为什么Phantom References在排队时没有被清除?

我们可以看到“幻影可达”与“无法访问”一样无法访问: §

如果一个对象既没有强烈,柔和,也没有弱到达,那么该对象是幻像可达的 ,它已经完成,并且一些幻像引用指的是它。

最后,如果无法通过上述任何方式访问对象,则无法访问该对象,因此有资格进行回收。

现在,来自: http : //download.oracle.com/javase/6/docs/api/java/lang/ref/PhantomReference.html

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

基本原理是什么? 还有一个吗?

这是Java API怪癖的另一个典型案例吗?

在引入时清除软引用,因为软引用的主要用途是允许缓存大对象,清除软引用允许对大型缓存对象进行垃圾回收。

排队时清除弱引用,因为弱引用的主要用途是允许一个引用一个对象而不阻止它被垃圾收集,因此一旦对象加入队列就清除引用允许对象被垃圾回收。

入队时不会清除幻像引用,因为幻像引用的一个用例是允许对象被垃圾回收之前执行清理。 通过不清除引用,对象保持幻像可达(并且不符合垃圾收集条件),直到用户清除对该对象的PhantomReference,或者PhantomReference本身被垃圾收集。

这在这里解释,

如果一个对象既没有强烈,柔和,也没有弱到达,那么该对象是幻像可达的,它已经完成,并且一些幻像引用指的是它。

最后,如果无法通过上述任何方式访问对象,则无法访问该对象,因此有资格进行回收。

在JDK 9中对此进行了更改 。现在幻像引用被清除为软引用和弱引用。 相应的段落已从Javadoc中删除。

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