我被问到一个问题(在这个网站上 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/