Java对象垃圾收集
我正在研究 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。
第1步 :
Student s1 = new Student("s1");
Student s2 = new Student("s2");
Student s3 = new Student("s3");
s1, s2, s3 正在引用堆空间中的 3 个对象
第2步 :
Student s1 = s3;
s1 现在正在引用堆空间中的 s3 对象
堆空间中的对象 s1 失去了他的引用
第 3 步:
Student s1 = s3;
Student s3 = s2;
变量s1引用s3堆空间
变量s3引用s2堆空间
第四步 :
Student s1 = s3;
Student s3 = s2;
Student s2 = null;
变量s1引用s3堆空间
变量s3引用s2堆空间
变量 s2 丢失了他的引用(空指针)
结论 :
第 11 行之后,一个对象有资格进行垃圾回收