符合垃圾收集条件的对象

use*_*967 6 java scjp

这个问题来自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条件?

  • 答:0
  • B:1
  • C:2
  • D:编译失败
  • E:不可能知道
  • F:运行时抛出异常

回答:

  • C是对的.只有一个CardBoard对象(c1)符合条件,但它具有相关的Short包装器对象,该对象也符合条件.
  • 基于以上原因,A,B,D,E和F不正确.(目标7.4)

Jac*_*hle 7

让我们逐行打破这个:

CardBoard c1 = new CardBoard();
Run Code Online (Sandbox Code Playgroud)

我们现在有两个对象,CardBoard c1分别在和Short c1.story.无论是供GC如c1在点CardBoardstory该变量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参数.c3null,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.


Aff*_*ffe 6

没有任何对象存在c3指向.构造函数只调用了两次,两个对象,每个对象指向一个c1c2. c3只是一个引用,除了空指针之外从未分配过任何东西.

c3当前指向null 的引用不会超出范围并从堆栈中删除,直到超过main方法结束时的右括号.

最初分配给的对象c1无法访问,因为c1引用设置为null,但c2引用尚未更改,因此分配给它的对象仍可通过c2引用从此范围访问.