java - SCJP 模拟题 : How many objects are eligible for garbage collection?

标签 java garbage-collection scjp

我被问到一个问题(在这个网站上 http://scjptest.com/ ):在这个代码示例中有多少对象符合垃圾回收的条件//some code goes here?

class A {
    private B b;
    public A() {
        this.b = new B(this);
    }
}

class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
}

public class Test { 
    public static void main(String args[]) {
        A aa = new A();
        aa = null;
        // some code goes here
    }
}

正确答案是:“a 和 b 引用的对象符合垃圾回收条件。”。但为什么?它们包含彼此的循环引用,它们可以相互访问。

谢谢!

最佳答案

they contain loop references to each other, they are accessible to each other.

是的,但无法再从其他任何地方访问它们,因此无法再在程序中看到和使用它们。

早期的 GC 在收集此类自引用对象组时存在问题,但对于现代分代收集器来说,这是一个已解决的问题。

简而言之,GC 可以遍历来自已知静态和堆栈对象的引用网络,或者

  • 将找到的所有对象复制到一个新的内存池中,自动留下任何“死”对象(这是“年轻一代”策略),或者
  • 标记所有找到的对象,以便在遍历整个引用网络后,它可以删除所有未标记的对象(这是“老/老一代”策略)。

关于java - SCJP 模拟题 : How many objects are eligible for garbage collection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5801732/

相关文章:

java - JVM SafePointStatistics - 任何人都可以帮助解释它

java - HashMap 不添加重复键

java - 将表达式的结果分配给原语

java - 如何使用 JPA 2 将复杂对象数组作为存储过程中的 IN 参数传递

java - 如何检测 Mac 是否具有来自 Java 的 Retina 显示屏?

c - 垃圾收集库

java - java堆设置中最大堆大小的限制

java - 为什么枚举中的静态和实例初始化 block 的行为与类中的不同

java - 使用 Android 向多个收件人发送多部分短信

java - 按钮交互失败