java - GC是否保证清除的References按拓扑顺序入队ReferenceQueue?

标签 java reference garbage-collection guava

假设有两个对象,AB,并且有一个指针 A.x --> B,我们创建,说, WeakReferenceAB,以及关联的 ReferenceQueue

假设 AB 都变得不可访问。直觉上 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/

相关文章:

java - 向一个对象发送对另一个尚未创建的对象的引用...

.net - 垃圾收集器有什么配置吗?

c# - 不受欢迎的垃圾收集

Java:重置单例对象

java - 野蝇。 FileNotFoundException(访问被拒绝)

java - 二维 ListView

c# - 解决C#内存泄漏的方法有哪些

java - 单击按钮时将组件添加到窗口

java - 字符串的变量引用值

python - 在 python 字典中赋值(复制与引用)