4

それをすべて要約する私の質問:

  • 強力に到達可能な Java PhantomReference は、参照先オブジェクトのメモリがガベージ コレクター (GC) によって再利用されるのを防ぐことができますか?

詳細は次のとおりです。

Callum もこの質問を投稿しましたが、簡単には答えられません。そこでの 1 つの回答は、私の質問に「いいえ」で答えているように見えるEthan Nicholasの記事を参照していますが、それが正しいかどうかはわかりません。

Java API を読んだことに基づいて、質問に「はい」と答える必要があります。

  • PhantomReference.clear() が呼び出されず、PhantomReference インスタンス自体が引き続き強く参照されている限り、参照先オブジェクトのメモリが再利用されることはなく、参照先はファントムに到達可能な状態のままになります。

この理解をサポートするために、Java Docsを引用します。

  • 「ソフト参照や弱い参照とは異なり、ファントム参照は、キューに入れられるときにガベージ コレクターによって自動的にクリアされません。ファントム参照を介して到達可能なオブジェクトは、そのようなすべての参照がクリアされるか、それ自体が到達不能になるまでそのままになります。」

たとえば、ファントム参照を作成し、そのインスタンスを PhantomReference のリストに保持するとします。次に、その指示対象は、強く到達可能なものから幻の到達可能なものに落ちます。

com.google.common.base.internal.Finalizer.java を見ると、次のコードが表示されます。

  private void cleanUp(リファレンス リファレンス) ShutDown {
      ...

      /*
       * これはファントム リファレンス用です。弱くて柔らかい
       * この時点で、参照はすでにクリアされています。
       */
      reference.clear();

      ...
  }

Web 検索を行ってリンクを提供するよりも、この件に詳しい人に回答してもらいたいと思います。ありがとう!

4

1 に答える 1