class ClassA {
ClassB mem1 = new ClassB();
ClassB mem2 = new ClassB();
}
class ClassB {
}
public class Sample {
public static void main(String[] args) {
ClassA obj1 = new ClassA();
ClassB obj2 = obj1.mem1;
obj1 = null;
obj2 = null;
}
}
在上面的程序中,行后会发生什么:obj1 = null
?
obj1 是否已准备好进行垃圾回收,即使其中一个成员对象仍被引用?
答案 0 :(得分:1)
自动垃圾收集是查看堆内存,识别正在使用哪些对象以及哪些对象未被删除以及删除未使用对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。
Java Garbage Collection Basics
在此上下文中,当处理obj1 = null;
时,不会引用它指向的类型ClassA
的对象,因此它可以用于垃圾回收。 ClassB
对象mem1
仍然以obj2
的形式提供引用,因此至少保留到执行第obj2 = null;
行。
答案 1 :(得分:0)
不再引用obj1
后,它就有资格进行垃圾回收。 mem1
仍然有一个引用,所以如果java此时要进行垃圾收集,obj1
和mem2
它的点数也将被释放,但mem1
将保持不变obj2
仍然指向它。
当然,在obj2 = null
之后,也可以收集它。
答案 2 :(得分:0)
您有3个类实例:ClassA
之一(我称之为classA_1
)和ClassB
中的两个(classB_1
,classB_2
)。现在查看这3个实例中存在的所有引用路径。
在obj1 = null
之前它看起来很像。像这样:
classA_1 <- Sample.main.obj1
classB_1 <- classA_1.mem1 <- Sample.main.obj1
classB_1 <- Sample.main.obj2
classB_2 <- classA_1.mem2 <- Sample.main.obj1
在obj1 = null
看起来像这样,no ref.
意味着,它有资格进行垃圾收集,因为它没有指向它的引用。
classA_1 <- no ref.
classB_1 <- classA_1.mem1 <- no ref.
classB_1 <- Sample.main.obj2
classB_2 <- classA_1.mem2 <- no ref.
唯一剩下的路径是:classB_1 <- Sample.main.obj2
。没有包含对象classB_2
和classA_1
的有效引用的路径。所以可以收集这些物品。