【问题标题】:Garbage collector in Java after a null空值后Java中的垃圾收集器
【发布时间】:2013-01-24 05:11:20
【问题描述】:

我正在根据 Java 认证书做一些练习。在关于垃圾收集的问题中,他们提供了以下代码:

class Test {
   private Demo d;
   void start() {
      d = new Demo();
      this.takeDemo(d);
   }
   void takeDemo(Demo demo) {
      demo = null;
      demo = new Demo();
   }
}

问题是

第 4 行创建的 Demo 对象何时符合垃圾标准 收藏?

我会说可以在指令demo=null;之后收集。因为不再引用它,但他们给出的答案是:

当运行此代码的实例符合垃圾条件时 收藏

我错过了什么?

【问题讨论】:

    标签: java garbage-collection


    【解决方案1】:

    Java is "pass-by-value",所以这条语句demo = null;只影响takeDemodemo的本地副本。它不会将d 设置为null,因此只要封闭实例可访问,就可以访问。

    【讨论】:

    • @Dukeling 不是这样的。
    • 如果比较 Java 和 C++,Java 更适合传递指针(基本上完全一样)。您可以说它是指针的按值传递,但是您只是使事情变得过于复杂(然后您可以在 C++ 中说同样的话)。请注意,我不会与您的其余答案争论。
    • 对我来说,在C/C++方面,Java实现的是纯值传递。
    • @Dukeling 引用与指针非常相似,但是当您将引用传递给方法时,传递的是指针的值,而不是指针本身。 This tutorial 似乎不同意你的说法......
    • 同意不同意(显然与所有人)。我很了解 Java,我也很了解 C++,我认为 C++ 中的指针传递和 Java 对象的传递方式没有区别。
    【解决方案2】:

    您正确地注意到demo 设置为null。但d 不是。它仍然持有对同一个对象的引用。于是就有了答案。

    【讨论】:

      【解决方案3】:

      因为demo = null只是改变了方法参数demo的值,它是方法本地的,不影响字段d的值。请记住,在 Java 中,所有方法参数都是按值传递的。

      【讨论】:

        【解决方案4】:

        在方法 start() 完成之前,对局部变量 d 的引用是“活动的”。在此之前,垃圾回收不应该释放它。

        【讨论】:

          【解决方案5】:

          第 4 行的 Demo 只能与 Test 实例一起收集。或者如果你再次调用 start 方法(旧的 Demo 将被收集并创建新的)

          takeDemo 方法对第一个 Demo 没有影响。但它创建了第二个演示。第二个Demo可以在takeDemo方法完成后立即收集。

          【讨论】:

            【解决方案6】:

            当你调用 this.takeDemo(d);引用 d 的值被复制到参数 demo 所以 d 和 demo 都引用在第 4 行中创建的对象。现在在方法内部,当您将变量 demo 设置为指向 null d 时仍然保留一个引用,因此该对象将是一旦 Test 类的实例被垃圾回收,就有资格进行垃圾回收。

            【讨论】:

              猜你喜欢
              • 2011-11-07
              • 1970-01-01
              • 2010-12-13
              • 2011-02-25
              • 1970-01-01
              • 1970-01-01
              • 2011-01-06
              • 1970-01-01
              相关资源
              最近更新 更多