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

时间:2011-08-13 05:25:22

标签: java garbage-collection

我们可以看到“幻影可达”与“无法到达”无法接触:§

  

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

     

最后,一个对象无法访问,因此当以上述任何方式无法访问时,它有资格进行回收。

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

  

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

这解释为here

  

如果一个物体既没有强烈,柔和,也没有微弱的可触及,它已被最终确定,并且某些幻像参考指的是它。

     

最后,当一个对象无法访问时,因此无法通过上述任何方式访问该对象。

答案 1 :(得分:4)

JDK 9中的这个was changed。现在幻像引用被清除为软引用和弱引用。相应的段落已从Javadoc中删除。

  

与软引用和弱引用不同,幻像引用不是   垃圾收集器在排队时自动清除。   可以通过幻像引用访问的对象将保持不变   直到所有这些引用被清除或自己成为   不可达。