晚上好,请查看此代码示例,其中显示了符合GC条件的对象数量:
public class CardBoard {
Short story = 5;
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);
c1 = null;
// do Stuff
}
}
我看到有四个对象符合GC的条件,当达到了那个c3并且它是关联的故事对象和c1以及它的相关故事对象时,你看到了什么?
答案 0 :(得分:8)
1 对象有资格使用GC - 之前由c1
引用的对象。 c3
指向null
(CardBoard.go()
始终返回null
)。
还要记住,c1
和c2
变量只是引用,而不是对象。因此,它们不需要被垃圾收集。他们生活在堆栈上,而不是堆在堆上。
最后不要被愚弄:
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
这只会使cb
引用(参数)无效,而不是c2
引用。
Short story = 5;
是一个单独的陷阱。如果它是short story
则它不会被视为单独的对象。但Short
是一个对象,因此技术上CardBoard
指向另一个符合GC条件的对象。然而!由于原始包装器缓存5
实际上是Short
静态缓存的一部分,并且从来没有真正符合GC的条件。换句话说,代表Short
的{{1}}类型的对象始终由5
中的static
缓存引用。
这是最好的部分。如果是:
Short
那么答案就是...... 2 。这是因为Short story = 5000;
始终返回Short.valueOf((short)5000)
的新实例(符合GC条件),而Short
始终返回相同的实例。