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