chr*_*cal 4 java garbage-collection
class CardBoard {
Short story = 200;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
System.out.println("c3 value : "+c3);
c1 = null;
System.out.println("c1 value : "+c1);
System.out.println("c2 value : "+c2);
// do Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这是SCJP6模拟考试的一个例子.问题是:当达到// doStuff时,有多少对象符合GC条件?答案是(2个对象),因为:只有一个CardBoard对象(c1)符合条件,但它有一个相关的Short包装器对象也符合条件.
当我执行代码时,看起来c3也指向null ...所以我会说3个对象符合GC的条件.
有人可以指导我完成这段代码的逻辑.
Vin*_*lds 10
该对象c3最初为null,因此不存在重新收集它的问题,因为它从未存在过.垃圾收集器旨在清除堆上实际存在的对象.
其余的,引用c2永远不会丢弃,因此不会被回收.尽管在语句中c2似乎无效,但CardBoard c3 = c1.go(c2);事实并非如此.引用c2已经通过值传递,虽然引用无效,但是在main方法中存在对该对象的现有引用.因此它不会被收回.
这留给我们c1,已经明确无效,因此有资格收集.但是,c1还包含对Short变量故事的引用,该变量故事没有来自任何其他对象的任何入站引用.这导致两个对象符合清理条件 - 一个CardBoard对象和嵌入的Short对象.