假设有两个对象,A
和 B
,并且有一个指针 A.x --> B
,我们创建,说, WeakReference
到 A
和 B
,以及关联的 ReferenceQueue
。
假设 A
和 B
都变得不可访问。直觉上 B
不能在 A
之前被认为是不可达的。在这种情况下,我们是否能以某种方式保证相应的引用将以直观的(没有循环时的拓扑)顺序排列在 ReferenceQueue
中? IE。 ref(A) 在 ref(B) 之前。我不知道——如果 GC 将一堆对象标记为不可访问,然后将它们按无特定顺序排列怎么办?
我正在审查 Finalizer.java Guava ,看到这个片段:
private void cleanUp(Reference<?> reference) throws ShutDown {
...
if (reference == frqReference) {
/*
* The client no longer has a reference to the
* FinalizableReferenceQueue. We can stop.
*/
throw new ShutDown();
}
frqReference
是对使用过的 ReferenceQueue
的 PhantomReference,因此如果这是 GC'ed,则没有 Finalizable{Weak, Soft, Phantom}References 可以存活,因为它们引用队列。因此,在队列本身可以被 GC 之前,它们必须被 GC 处理——但是,我们是否仍然可以保证这些引用将按照它们获得“垃圾收集”的顺序排入 ReferenceQueue
”(好像他们一个一个地得到 GC)?该代码暗示存在某种保证,否则理论上未处理的引用可能会保留在队列中。
谢谢
最佳答案
我很确定答案是否定的。
JVM 规范对终结器方法是这样说的:
The Java virtual machine imposes no ordering on finalize method calls. Finalizers may be called in any order or even concurrently. (JVM spec 2.17.7)
由此我推断,不能保证引用按拓扑顺序排队。
关于java - GC是否保证清除的References按拓扑顺序入队ReferenceQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497014/