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");
  ......
}

Can we switch off finalizers? に触発されました。

4

2 に答える 2

2

追加した行

this.a=this;

GC になることを妨げるものではありませんA。このオブジェクトは、ライブ スレッドのような有効なものからまだ参照されていません。

より複雑な構造を見てみましょう:List

最後のノードを最初のノード (循環リスト) にポイントし、設定するNode head = null;場合、各ノードはまだ他のノードからポイントされている可能性がありますが、リスト全体がライブ スレッドから参照されていないため、ガベージ コレクションが行われます。 .

ガベージ コレクターは、オブジェクトが参照されているかどうかをチェックするだけでなく、有効なスレッドからの参照があるかどうかを詳細にチェックします

要点は次のとおりです。

スレッドからオブジェクトに到達できない場合、そのオブジェクトはガベージ コレクションされます。あなたの場合、Aはもう到達できません。

于 2014-01-06T14:38:14.340 に答える