Java中的数组垃圾收集

时间:2019-01-25 09:01:24

标签: java arrays garbage-collection

我有2节课。

  
      
  1. 玩具车
  2.   
  3. 玩具商店
  4.   

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())
}

如果我运行该程序,将对cars数组进行垃圾收集,还是仅收集cars [0]和cars [1]?

如果该数组是垃圾回收的,我可以在公司中打印出toyCar吗?

如果我的问题没有道理,请指出。

2 个答案:

答案 0 :(得分:2)

几乎可以肯定,该程序将在GC运行之前完成。所以...从技术上讲...什么也不会收集垃圾。

类似地,main方法完成后,它创建的所有对象将无法访问并且可以进行垃圾回收。 (即使程序没有终止。)

但是,当您进入print语句时,company对象将是可访问的,并且其toy字段将是可访问的,因此该字段的值将是可访问的...并且{ {1}}所引用的对象将不会被垃圾回收,无论那时GC是否已运行。

一般规则是,如果您的应用程序可以到达对象,则不会对其进行垃圾回收。基本上,不用担心。如果您的代码可以使用该对象,该对象仍将在那里。

答案 1 :(得分:1)

这三行代码构建了mydata$State <- as.character(mydata$State) mydata$MV.Number = as.numeric(mydata$MV.Number) mydata = mydata[mydata$State != "Alaska", ] mydata = mydata[mydata$State != "Hawaii", ] devtools::install_github("dkahle/ggmap", ref = "tidyup", force=TRUE) library(ggmap) ggmap::register_google(key = "...") #my key is here for (i in 1:nrow(mydata)) { latlon = geocode(mydata[i,1]) mydata$lon[i] = as.numeric(latlon[1]) mydata$lat[i] = as.numeric(latlon[2]) } mv_num_collisions = data.frame(mydata$MV.Number, mydata$lon, mydata$lat) colnames(mv_num_collisions) = c('collisions','lon','lat') usa_center = as.numeric(geocode("United States")) USAMap = ggmap(get_googlemap(center=usa_center, scale=2, zoom=4), extent="normal") USAMap + geom_point(aes(x=lon, y=lat), data=mv_num_collisions, col="orange", alpha=0.4, size=mv_num_collisions$collisions*circle_scale_amt) + scale_size_continuous(range=range(mv_num_collisions$collisions)) 的三个不同的新对象

ToyCar

执行这两行代码后

  cars[0] = new ToyCar();
  cars[1] = new ToyCar();
  cars[2] = new ToyCar();

前两个汽车对象将有资格进行垃圾收集。因为JVM中不存在对该对象的外部引用。

现在来到这一行

cars[0] = null;
cars[1] = null;

第三个对象引用被分配给一个引用变量ToyShop company = new ToyShop(); company.setToyCar(cars[2]); //now car object at 2ond Index have external ref. ,该变量作为成员变量出现在toyCar中。

因此,在执行company行之后,cars = null;中仍然存在一个外部引用。

因此,执行JVM后只有2个对象可以进行垃圾回收。