这个问题来自Kathy Sierra SCJP 1.6.有多少个对象符合垃圾收集的条件?
根据Kathy Sierra的回答,确实如此C.这意味着两个对象有资格进行垃圾回收.我给出了答案的解释.但为什么c3不符合垃圾收集(GC)的条件?
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);
c1 = null;
// Do stuff
} }
Run Code Online (Sandbox Code Playgroud)
何时// Do stuff到达,有多少对象符合GC条件?
回答:
Short包装器对象,该对象也符合条件.让我们逐行打破这个:
CardBoard c1 = new CardBoard();
Run Code Online (Sandbox Code Playgroud)
我们现在有两个对象,CardBoard c1分别在和Short c1.story.无论是供GC如c1在点CardBoard和story该变量CardBoard在点Short......
CardBoard c2 = new CardBoard();
Run Code Online (Sandbox Code Playgroud)
与上面类似,我们现在有四个对象,其中没有一个可用于GC.
CardBoard c3 = c1.go(c2);
Run Code Online (Sandbox Code Playgroud)
我们调用方法go在指向的CardBoard上c1,传递其值c2是对CardBoardObject 的引用.我们使参数为空,但Java是按值传递的,这意味着c2变量本身不受影响.然后我们返回nullled参数.c3是null,c1并且c2不受影响.我们仍然有4个对象,其中没有一个可以GC.
c1 = null;
Run Code Online (Sandbox Code Playgroud)
我们无效c1.以前指出的CardBoard对象c1没有指向它,它可以是GC'd.因为该对象中的story变量CardBoard是指向该对象的唯一内容Short,并且因为该CardBoard对象符合GC的条件,所以Short也符合GC的条件.这给了我们4个对象,其中2个可以是GC'd.符合GC条件的对象是以前用c1和引用的对象c1.story.
没有任何对象存在c3指向.构造函数只调用了两次,两个对象,每个对象指向一个c1和c2. c3只是一个引用,除了空指针之外从未分配过任何东西.
c3当前指向null 的引用不会超出范围并从堆栈中删除,直到超过main方法结束时的右括号.
最初分配给的对象c1无法访问,因为c1引用设置为null,但c2引用尚未更改,因此分配给它的对象仍可通过c2引用从此范围访问.
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |