我有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())
}
如果我运行该程序,将对cars数组进行垃圾收集,还是仅收集cars [0]和cars [1]?
如果该数组是垃圾回收的,我可以在公司中打印出toyCar
吗?
如果我的问题没有道理,请指出。
答案 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个对象可以进行垃圾回收。