You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

以下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;
    }
}

我们跟着代码执行流程,梳理每个对象的引用变化:

  1. 执行X x = new X();
    创建第一个X对象,我们叫它Obj1,变量x持有对Obj1的引用,此时Obj1有有效引用,不能被回收。

  2. 执行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,两个对象都有有效引用,都不符合回收条件。
  3. 执行X x4 = new X();
    创建第三个X对象Obj3,变量x4持有对Obj3的引用,三个对象都有对应的引用。

  4. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:44