java - 垃圾收集 - 为什么 c3 在此示例中不符合收集条件 (SCJP 6)

标签 java garbage-collection pass-by-value scjp

<分区>

摘自 SCJP 6 准备书 -

给定:

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 条件?

A. 0

B. 1

C. 2

D. Compilation fails

E. It is not possible to know

F. An exception is thrown at runtime

正确答案是 C - “只有一个 CardBoard 对象 (c1) 符合条件,但它有一个关联的短包装对象也符合条件。”

我的问题是为什么 c3 不符合收集条件?

我的想法是——

c1.go(c2) 将局部引用变量 cb(它是 c2 的副本)设置为 null,然后返回分配给 c3 的 cb。我知道c2本身的引用变量在方法中是不能修改的,只能修改后面的对象。然而,在我看来,引用变量的副本 cb 被设置为 null 并分配给 c3。为什么c3在这个实例中没有设置为返回的null?

最佳答案

没有与c3相关的对象。它的值为 null,所以没有什么可收集的。

关于java - 垃圾收集 - 为什么 c3 在此示例中不符合收集条件 (SCJP 6),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18875398/

相关文章:

java - 如何有效地检查给定的 URL(String) 是否包含 Java 中的白名单域(String)

java - 如何在 Linux 机器上的 Tomcat 上运行 Web 应用程序时使用 JVM 参数

c++ - 通过值传递和引用传递将大小为 n 的 Vector 传递给另一个函数的时间复杂度是多少?

Python:threading.Thread,值是按值传递还是按引用传递?

java - 删除尾随和前导空格

java - 如何延迟加载 uibinded GWT 编辑器

java - 让 Java 与 Python、C、C++ 和 Ruby 对话

multithreading - GHC 每线程 GC 策略

java - 重新分配引用对象时对内存的影响

c++11 - 为什么标准库中的 std::chrono::duration 实例不按值传递?