1

Java の PhantomReference について少し混乱しています。私がオンラインの記事を見たとき、それらのほとんどは、参照で get() を呼び出しても、PhantomReference オブジェクトは作成後に null を返すと述べており、また、PhantomReference が削除されると、オブジェクトがファントム的に到達可能であり、ReferenceQueue に挿入されると述べています。想い出。

次のコード例を試しましたが、結果に混乱があります。

Equipment equipment = new Equipment();  
ReferenceQueue queue = new ReferenceQueue();  
PhantomReference pr = new PhantomReference(equipment, queue);

System.out.println(pr.get());  
System.out.println(queue.poll()); 

上記の 2 つのステートメントは null を出力します。pr.get() が null を返す場合、pr によって参照されるオブジェクトがガベージ コレクションされることを意味しますか? そうである場合、オブジェクトがまだ優先キューに追加されていないのはなぜですか?

誰でもこれを明確にするために私を助けてくれますか。PhantomReference と ReferenceQueue に関する私の理解が間違っていたら、お詫び申し上げます。

この 2 つの用語についても簡単に説明してください

どうもありがとう

4

1 に答える 1

2

PhantomReference#get() 常に戻りますnull

この参照オブジェクトの指示対象を返します。ファントム参照の参照先には常にアクセスできないため、このメソッドは常に null を返します。

を通じて収集されたかどうかはわかりませんget()

その場合、オブジェクトがまだ優先キューに追加されていない理由

javadocの状態

ある時点でファントム参照の参照先がファントムに到達可能であるとガベージ コレクターが判断した場合、その時点または後で参照をキューに入れます。

そのため、poll()(非ブロッキング) が呼び出されるまでにインスタンスがガベージ コレクションされていないか、インスタンスがガベージ コレクションされたが、対応するインスタンスが にPhantomReference追加されていませんReferenceQueue

GCへの強い参照を設定して GC を要求するだけでなく、キューからのブロックnullも行うことで、それを支援できます。removeReference

equipment = null;
System.out.println(pr.get());
System.gc();
System.out.println(queue.remove()); // block and wait for it to be added
于 2014-10-08T15:44:05.287 に答える