Java 对象垃圾回收
Java object garbage collection
我正在研究 OCA Java 认证,不确定如何理解一个问题的答案。
public class Test {
public static void main(String[] args){
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3;
s3=s2;
s2=null;
//HERE
}
}
问题是在 //HERE 点之后哪个对象可用于垃圾回收。
在线测试提供的答案是:一个对象(o1)。
谁能解释一下为什么?
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3; // The "s1" variable now points to the object referenced to by s3, ie "o3"
s3=s2; // The "s3" variable now points to the object referenced to by s2, ie "o2"
s2=null; // The "s2" variable points to nothing
在执行结束时,对象“o3”和“o2”被变量引用(分别为“s1”和“s3”)。因此,对象“o1”没有被任何变量指向,并且可以被垃圾收集器销毁。
退出该方法后,所有对象都将符合垃圾回收条件,因为 s1、s2、s3 是局部变量,引用不会传递到外部。
然而在方法的最后一行,s1 持有对 o3 的引用,s2 指向无处,s3 指向 o2。只有 o1 没有指向他的引用,因此它符合垃圾收集的条件。
考虑一个简单的 class 学生。
第 1 步:
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
s1、s2、s3 正在引用堆中的 3 个对象 space
第 2 步:
Student s1 = s3;
s1 现在正在引用堆中的 s3 对象 space
堆中的对象 s1 space 失去了他的引用
第 3 步:
Student s1 = s3;
Student s3 = s2;
变量s1引用s3堆space
变量s3引用s2堆space
第 4 步:
Student s1 = s3;
Student s3 = s2;
Student s2 = null;
变量s1引用s3堆space
变量s3引用s2堆space
变量 s2 丢失了他的引用(空指针)
结论:
第 11 行之后,有一个对象符合垃圾回收条件
每次弹出这样的问题,答案都是一样的:评论HERE
之后,每个对象都有资格进行垃圾回收。该行之后没有使用任何内容,因此不存在对 any 对象的强引用,因此所有内容都符合 GC 的条件。不幸的是,这些问题只有在获得正确的考试“分数”的情况下才有意义,因此人们按照它们的方式学习它们。现实情况是,如果没有 可达性 的更广泛背景,他们只会让用户感到困惑,imo。
想一想 - 在该评论之后是否有任何对您的任何对象的实时引用?否。因此,是否每个实例都符合 GC 的条件?是的。请注意,他们在评论之后才有资格,而不是在方法结束之后。不要将 scope 和 reachability 混合在一起。
我正在研究 OCA Java 认证,不确定如何理解一个问题的答案。
public class Test {
public static void main(String[] args){
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3;
s3=s2;
s2=null;
//HERE
}
}
问题是在 //HERE 点之后哪个对象可用于垃圾回收。
在线测试提供的答案是:一个对象(o1)。
谁能解释一下为什么?
Student s1 = new Student("o1");
Student s2 = new Student("o2");
Student s3 = new Student("o3");
s1=s3; // The "s1" variable now points to the object referenced to by s3, ie "o3"
s3=s2; // The "s3" variable now points to the object referenced to by s2, ie "o2"
s2=null; // The "s2" variable points to nothing
在执行结束时,对象“o3”和“o2”被变量引用(分别为“s1”和“s3”)。因此,对象“o1”没有被任何变量指向,并且可以被垃圾收集器销毁。
退出该方法后,所有对象都将符合垃圾回收条件,因为 s1、s2、s3 是局部变量,引用不会传递到外部。
然而在方法的最后一行,s1 持有对 o3 的引用,s2 指向无处,s3 指向 o2。只有 o1 没有指向他的引用,因此它符合垃圾收集的条件。
考虑一个简单的 class 学生。
第 1 步:
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
s1、s2、s3 正在引用堆中的 3 个对象 space
第 2 步:
Student s1 = s3;
s1 现在正在引用堆中的 s3 对象 space
堆中的对象 s1 space 失去了他的引用
第 3 步:
Student s1 = s3;
Student s3 = s2;
变量s1引用s3堆space
变量s3引用s2堆space
第 4 步:
Student s1 = s3;
Student s3 = s2;
Student s2 = null;
变量s1引用s3堆space
变量s3引用s2堆space
变量 s2 丢失了他的引用(空指针)
结论:
第 11 行之后,有一个对象符合垃圾回收条件
每次弹出这样的问题,答案都是一样的:评论HERE
之后,每个对象都有资格进行垃圾回收。该行之后没有使用任何内容,因此不存在对 any 对象的强引用,因此所有内容都符合 GC 的条件。不幸的是,这些问题只有在获得正确的考试“分数”的情况下才有意义,因此人们按照它们的方式学习它们。现实情况是,如果没有 可达性 的更广泛背景,他们只会让用户感到困惑,imo。
想一想 - 在该评论之后是否有任何对您的任何对象的实时引用?否。因此,是否每个实例都符合 GC 的条件?是的。请注意,他们在评论之后才有资格,而不是在方法结束之后。不要将 scope 和 reachability 混合在一起。