tangguo

为什么幻影引用入队后不清除?

java

我们可以看到“幻影可达”和“不可可达”一样:§

如果对象既不是强的,软的也不是弱的,并且已被终结,则它是幻影可到达的,并且某些幻像引用引用了该对象。

最后,当对象无法通过上述任何一种方式到达时,它是不可到达的,因此有资格回收。

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

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

基本原理是什么?哪有一个?

这是Java API怪癖的另一种典型情况吗?


阅读 312

收藏
2020-10-17

共1个答案

小编典典

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

弱引用在入队时会被清除,因为弱引用的主要用途是允许一个对象引用一个对象而不阻止其被垃圾回收,因此,一旦对象被排队,清除引用就可以对该对象进行垃圾回收。

幻像引用入队后不会清除,因为幻像引用的一种使用情况是允许在垃圾回收对象之前执行清理。通过不清除引用,该对象将保持幻像可访问的状态(并且不符合垃圾收集的条件),直到用户清除对该对象的PhantomReference或PhantomReference本身就是垃圾收集为止。

这在这里解释,

如果对象既不是强的,软的也不是弱的,并且已被终结,并且有一些幻像引用对其进行引用,则它是幻像可到达的。

最后,当对象无法通过上述任何一种方式到达时,它是不可到达的,因此有资格回收。

2020-10-17