0

类的实例会A被垃圾收集还是会永远留在内存中?

我知道,如果一个对象符合垃圾回收的条件并且它的finalize()方法已被调用,并且在此方法中该对象可以被实时执行线程访问,则它不是垃圾回收。

public class A{

  String someString = null;
  private A a=null;
  public String getSomeString() {
    return someString;
  }
  public void setSomeString(String someString) {
    this.someString = someString;
  }
  @Override
  protected void finalize() throws Throwable {
    try {
      this.a=this;
      System.out.println("final called");      
    } finally {
      super.finalize();
    }
  }
}
public static void main(String args[]) throws Exception {
  A s1=new A();
  s1=null;
  System.gc();
  System.out.println("gc called");
  ......
}

灵感来自我们可以关闭终结器吗?

4

2 回答 2

4

该赋值(在finalize())方法中不会使目标对象(this)强可达,因此不会阻止它被垃圾收集。

另一方面,如果你这样做:

    otherObject.a = this;

otherObject引用了一个强可达的对象,那么分配将使强可达,并且它会this阻止该对象被收集(虽然它仍然是可达的......)。但是下一次this变得无法访问,该finalize方法将不会被调用。对象的finalize方法在对象的生命周期中只被调用一次。


我认为this.a=this分配参考它的财产?如果我错了,请纠正我..

你是对的,但没有区别。你所做的只是this指出自己。这并不能使它达到...

于 2014-01-06T14:37:29.653 回答
2

您添加的行

this.a=this;

不是会阻止AGC 的东西,这个对象仍然没有被像活动线程这样的有效对象引用。

尝试查看更复杂的结构:List

如果你将最后一个节点指向第一个(循环列表),然后设置你的Node head = null;then 可能每个节点仍然从另一个节点指向,但是整个 List 没有被活动线程引用,因此将被垃圾收集.

垃圾收集器不仅检查对象是否被引用,而且深入检查是否存在来自有效线程的引用。

底线是:

如果一个对象无法从线程访问,则它会被垃圾收集。在您的情况下,A 不再可达。

于 2014-01-06T14:38:14.340 回答