以下Java代码中符合垃圾回收条件的对象数量是多少?
分析这段Java代码中的可回收对象数量
先把代码贴出来方便逐行拆解:
public class X { static X fun(X ref) { ref = new X(); return ref; } public static void main(String args[]) { X x = new X(); X x2 = fun(x); X x4 = new X(); x2 = x4; } }
我们跟着代码执行流程,梳理每个对象的引用变化:
执行
X x = new X();
创建第一个X对象,我们叫它Obj1,变量x持有对Obj1的引用,此时Obj1有有效引用,不能被回收。执行
X x2 = fun(x);- 调用
fun(x)时,参数ref是x的引用副本,一开始也指向Obj1。 - 在
fun方法里执行ref = new X();,创建第二个X对象Obj2,此时ref的引用被覆盖为指向Obj2(注意:这只是修改了副本引用,外部的x依然指向Obj1)。 - 方法返回
ref,所以x2现在持有对Obj2的引用。 - 此时:
x→Obj1,x2→Obj2,两个对象都有有效引用,都不符合回收条件。
- 调用
执行
X x4 = new X();
创建第三个X对象Obj3,变量x4持有对Obj3的引用,三个对象都有对应的引用。执行
x2 = x4;
将x2的引用改为指向Obj3(和x4共享同一个对象的引用)。这一步执行后,原来的Obj2再也没有任何变量持有它的引用了——它变成了无引用对象,正式符合垃圾回收的条件。
当所有main方法的语句执行完毕时,当前的引用状态是:
x依然指向Obj1(有有效引用,不能回收)x2和x4同时指向Obj3(有有效引用,不能回收)- Obj2:无任何引用,可被垃圾回收
所以此时,符合垃圾回收条件的对象有1个。
补充说明:当main方法执行完毕后,局部变量x、x2、x4会被销毁,此时Obj1和Obj3也会失去所有引用,三个对象都会成为垃圾回收的目标,但我们通常分析的是代码执行完所有语句后的即时状态,所以答案是1个。
内容的提问来源于stack exchange,提问作者Rajan saha Raju
相关产品推荐
相关产品推荐

