それをすべて要約する私の質問:
- 強力に到達可能な 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 検索を行ってリンクを提供するよりも、この件に詳しい人に回答してもらいたいと思います。ありがとう!