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 行之后,一个对象有资格进行垃圾回收


以上是Java对象垃圾收集的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>