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

当执行到第16行时,下述代码中有多少对象可被垃圾回收?

Java垃圾回收对象数量分析

先贴出待分析的代码:

class Beta{ } 
class Alpha {
  static Beta b1;
  Beta b2;
}
public class Tester {
  public static void main(String[] args) {
    Beta b1 = new Beta(); Beta b2 = new Beta();
    Alpha a1 = new Alpha(); Alpha a2 = new Alpha();
    a1.b1 = b1;
    a1.b2 = b1;
    a2.b2 = b2;
    a1 = null; b1 = null; b2 = null;
    // do stuff
  }
}

对象创建统计

代码一共创建了4个对象:

  • 2个Beta实例(下文简称Beta1、Beta2)
  • 2个Alpha实例(下文简称Alpha1、Alpha2)

第16行时的引用情况分析

执行完第15行的赋值操作后,各对象的引用状态如下:

  • Alpha1:原局部变量a1被置为null,没有其他任何引用指向该对象,满足垃圾回收条件。
  • Alpha2:局部变量a2仍指向该对象,存在有效引用,不会被回收。
  • Beta1:虽然局部变量b1被置为null,但Alpha类的静态变量b1仍持有它的引用(注意a1.b1是类静态成员,操作的是Alpha类的变量而非a1实例的变量),因此存在有效引用,无法被回收。
  • Beta2:虽然局部变量b2被置为null,但Alpha2的实例变量b2仍指向它,而Alpha2本身有有效引用,因此Beta2也无法被回收。

结论

符合垃圾回收条件的对象只有1个,即Alpha1。你认为有2个可回收对象的误区,大概率是忽略了Alpha类的静态变量仍在引用Beta1这一点。

内容的提问来源于stack exchange,提问作者Kartik Sinha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:10:34