【问题标题】:Number of objects eligible for garbage collection符合垃圾回收条件的对象数
【发布时间】:2012-11-13 21:51:05
【问题描述】:

我不确定我是否完全理解垃圾收集器的行为,因此我根据previous question 提出这个问题。

在这个程序中:

class A {
    Boolean b;
    A easyMethod(A a){
       return new A();
    }
    public static void main(String [] args){
        A a1 = new A();
        A a2 = new A();
        A a3 = new A();
        a3 = a1.easyMethod(a2);
        a1 = null;
        // Some other code 
    }
} 

有多少对象可以进行垃圾回收?我认为虽然a3 永远不会变为null,但分配给它的第一个对象(new A())也应该被垃圾回收,因为没有引用仍然指向它。我对吗?因此,我认为正确的答案将再次是 2 个对象。什么是真的?

【问题讨论】:

  • 不要将您的问题建立在另一个问题上,这不是一个讨论线程。在此处发布完整的相关代码。
  • 编译器很可能会丢弃它发现的任何变量和赋值,在它们的潜在生命周期内永远不会再被读取。因此,分配给代码中变量的对象不会在运行时自动引用或“可访问”,这意味着该对象可能在其构造函数执行后立即符合收集条件。

标签: java garbage-collection


【解决方案1】:

我认为尽管a3 永远不会变为null,但分配给它的第一个对象(new A())也应该被垃圾回收,因为没有引用仍然指向它。我对吗?因此,我认为正确的答案应该是 2 个对象。

是的,这完全正确。 a3 最初指向A 的一个实例,但在将该变量重新分配为指向不同的实例后,不再有任何方法可以到达原始实例,因此该原始实例有资格进行垃圾回收。

【讨论】:

    【解决方案2】:

    是的,你是对的。

    a1 = <instance 1>
    a2 = <instance 2>
    a3 = <instance 3>
    a3 = <instance 4> //as a returned value
    a1 = null
    

    所以instance 1instance 3 不再被引用,因此可能会被收集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多