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

dsa*_*ish 16 java garbage-collection

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

如果一个物体既不是强烈的,柔和的,也不是微弱的可触及的,那么该物体是幻影可达的,它已被最终确定,并且一些幻象参考指的是它.

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

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

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

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

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

sbr*_*ges 7

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

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

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

在这里解释,

如果一个物体既不是强烈的,柔和的,也不是微弱的可触及的,那么该物体是幻影可达的,它已被最终确定,并且一些幻象参考指的是它.

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

  • 如果已经为对象创建了一个幻像引用但是没有对它的其他引用存在,那么通过什么方式可以访问该对象的可访问引用?如果不存在可访问的引用,为什么不能收集该对象? (5认同)
  • 更新:似乎对于Java 9,他们已经改变了幻像引用的行为.java的9之前,曾经是这更容易幻影引用,因为你有机会访问,这是即将被垃圾收集的对象(它没有被入队之前gc'ed,它可以由保护`referent`访问变量没有复活它).但似乎他们已经在java 9中改变了这一点,因此在引用之前,引用对象现在是gc'ed.那么.在我的OpenGL示例中,您也可以使用弱引用(也可能更好,因为弱引用比幻像引用更早排队). (3认同)

Zhe*_*lov 5

这种改变在JDK 9.现在虚引用软引用和弱引用做被清除。并且相应的段落已从Javadoc中删除。

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