2

在我为 OCJP 学习时,我遇到了以下问题:

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 
}}

当达到 //doStuff 时,有多少对象符合 GC 条件?
正确答案是2,意义c1及其story对象。

当到达 //doStuff 行时,c3 也为空。为什么它也没有资格获得 GC?

4

6 回答 6

5

c3 是具有空引用的本地句柄,它不指向(并且已经指向)分配的对象。因此GC没有任何意义。

于 2012-10-28T14:38:21.170 回答
1

c3不是一个对象。它是一个引用 null 的变量。变量不能符合 GC 条件。只有对象才有资格进行 GC。

符合 GC 条件的对象是最初由 引用的 Cardboardc1和最初由 最初引用的 CardBoard 引用的 Short 实例c1

于 2012-10-28T14:38:19.113 回答
1

垃圾收集器扫描内存中的对象,当它找到一个对象时检查指向它的句柄(而不是相反) 当垃圾收集器被调用时,没有句柄指向它们的对象(在内存中)将从内存中删除。在这段代码中,您只在内存中创建了 2 个对象,但有 3 个句柄。垃圾收集器最多只能删除 2 个对象(因为只存在两个对象) C3 只指向一个空位置。C1、C2、C3 不会被移除。他们曾经指向的对象被删除(如果没有其他句柄指向它们)。因此,在这一点上,由于 C3 从未指向内存中的对象,因此将其设置为 null 不会对垃圾收集器产生影响。

希望我有帮助

于 2012-10-28T14:43:03.897 回答
0

你的CardBoard#go()方法什么都不做。它接收到某个对象的引用,立即忘记它,替换为null,并返回该null值。

所以,线

CardBoard c3 = c1.go(c2);

也不做任何事情,即没有对象被创建。只是将 null 分配给c3. 所以它不是垃圾收集,因为它已经不存在。

于 2012-10-28T14:43:55.040 回答
0

c3本身只是一个引用变量,不在堆空间内(即不在垃圾回收范围内)

该行CardBoard c3 = c1.go(c2);仅将 c3 引用设置为 null 因此 c3 不会影响垃圾收集,因为它不会使任何对象符合条件。

于 2017-12-22T01:04:21.203 回答
0

c3 没有对对象的引用,这只是为了制造一些混乱。

我们创建了两个对象 c1 和 c2,我们缺少的是 Short 类型的包装对象,所以基本上我们总共创建了四个对象。

当我们使 c1 = null 时,这意味着我们使用 c1 访问的短对象可用于 GC,而不是我们可以使用 c2 访问的短对象。

这可以使用以下代码进行验证:

公共类纸板{

Short story = 200;

CardBoard go(CardBoard cb) {
    cb = null;
    return cb;
}

public static void main(String[] args) {
    Runtime run = Runtime.getRuntime();

    CardBoard c1 = new CardBoard();
    CardBoard c2 = new CardBoard();
    CardBoard c3 = c1.go(c2);

    // System.out.println(run.freeMemory());

    run.gc();
    // System.out.println(run.freeMemory());

    c1.story = 100;

    System.out.println(c1.story);
    c1 = null;
    run.gc();

    System.out.println(c2.story);

}

}

输出:100 200

这意味着我们可以从 c1 访问的 c1 和 Short story 可用于垃圾收集,而不是 c2 的 Short story。

于 2018-01-12T05:53:38.680 回答