java对象垃圾收集

egdjgwm8  于 2021-08-20  发布在  Java
关注(0)|答案(4)|浏览(571)

我正在进行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)。
有人能解释一下为什么吗?

v1l68za4

v1l68za41#

考虑一个简单的班学生。
步骤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堆空间

步骤4:

Student s1 = s3;
Student s3 = s2;
Student s2 = null;

变量s1引用s3堆空间
变量s3引用s2堆空间
变量s2失去了引用(空指针)

结论:
在第11行之后,一个对象有资格进行垃圾收集

nbysray5

nbysray52#

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”不是由任何变量指向的,可以由垃圾收集器销毁。

f0ofjuux

f0ofjuux3#

退出该方法后,所有对象都将有资格进行垃圾收集,因为s1、s2、s3是局部变量,引用不会传递到外部。
然而,在方法的最后一行,s1表示o3,s2表示无处,s3表示o2。只有o1没有指向他的引用,因此它有资格进行垃圾收集。

qv7cva1a

qv7cva1a4#

每次这些问题出现时,答案都是一样的:在评论之后 HERE ,每个对象都有资格进行垃圾收集。该行之后不使用任何内容,因此不存在对任何对象的强引用,因此所有内容都符合gc的条件。不幸的是,这类问题只有在考试获得正确“分数”的情况下才有意义,因此人们按照自己的方式学习。imo表示,现实是,如果没有更广泛的可达性背景,它们只会让用户感到困惑。
想一想——在那条评论之后,是否有任何对您的任何对象的实时引用?否。因此,是否每个示例都符合gc条件?对请注意,它们在该注解之后是合格的,而不是在方法结束之后。不要将范围和可达性混为一谈。

相关问题