Java中的数组垃圾收集

我有2节课。

  1. 玩具车

  2. 玩具店

ToyShop 有一个toyCar接受ToyCar对象的字段。

public static void main(String[] args) {

  ToyCar[] cars = new ToyCar[3];

  cars[0] = new ToyCar();

  cars[1] = new ToyCar();

  cars[2] = new ToyCar();

  ToyShop company = new ToyShop();

  company.setToyCar(cars[2]);

  cars[0] = null;

  cars[1] = null;

  cars = null;

  print(company.getToyCar())

}

如果我运行程序,汽车数组会被垃圾收集,还是只收集汽车[0]和汽车[1]?


toyCar如果阵列被垃圾收集,我可以在公司打印出来吗?


如果我的问题没有意义,请指出。


皈依舞
浏览 163回答 2
2回答

MMMHUHU

几乎可以肯定,程序将在 GC 运行之前完成。所以......从技术上讲......没有垃圾收集。类似地,当main方法完成时,它创建的所有对象都将无法访问并且有资格被垃圾收集。(即使程序没有终止。)但是,当您到达 print 语句时,该company对象将是可访问的,并且其toy字段将是可访问的,因此该字段的值将是可访问的......并且ToyCar它所引用的对象不会被垃圾收集,无论是那时 GC 还没有运行。一般规则是,如果您的应用程序可以访问一个对象,它就不会被垃圾回收。基本上,不用担心。如果您的代码可以使用该对象,该对象仍将存在。

GCT1015

这里这三行代码构造了三个不同的新对象ToyCar  cars[0] = new ToyCar();  cars[1] = new ToyCar();  cars[2] = new ToyCar();执行完这两行代码cars[0] = null;cars[1] = null;前两个汽车对象将有资格进行垃圾收集。因为 JVM 中不存在对该对象的外部引用。现在来到这条线ToyShop company = new ToyShop();company.setToyCar(cars[2]);  //now car object at 2ond Index have external ref.这里第三个对象引用被分配给toyCar作为成员变量存在的引用变量company。因此,在执行 line 之后,cars = null;仍然存在一个外部引用JVM。因此,只有 2 个对象在执行cars = null;.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java