6

リンクhttps://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.htmlに従って、PhantomReferencesはオブジェクトがメモリから物理的に削除された場合にのみキューに入れられ、WeakReferencesはファイナライズまたはガベージ コレクションが行われる前にキューに入れられます。実際に起こりました。

違いは、エンキューが発生する正確なタイミングにあります。WeakReferences は、それらが指すオブジェクトが弱く到達可能になるとすぐにキューに入れられます。これは、ファイナライズまたはガベージ コレクションが実際に行われる前です。理論的には、オブジェクトは非正統的な finalize() メソッドによって「復活」することさえできますが、WeakReference は無効なままになります。PhantomReferences は、オブジェクトがメモリから物理的に削除された場合にのみキューに登録され、get() メソッドは常に null を返します。これは、ほとんど死んでいるオブジェクトを「復活」させることができないようにするためです。

一方、http://www.ibm.com/developerworks/library/j-refs/に従って、ヒープ オブジェクトが解放される前にPhantomReferenceReferenceQueue追加され、ファイナライズまたはガベージ コレクションの後にWeakReferencesがその ReferenceQueue に追加されます。

ソフト参照や弱参照とは異なり、PhantomReference は、ヒープ オブジェクトが解放される前に ReferenceQueue に追加されます。(すべての PhantomReference オブジェクトは、関連する ReferenceQueue を使用して作成する必要があることに注意してください。) これにより、ヒープ オブジェクトが再利用される前にアクションを実行できます。

ヒープ オブジェクトの finalize() メソッドが実行され、そのメモリが解放されると、WeakReference オブジェクトがその ReferenceQueue に追加されます (存在する場合)。

私は混乱しています。どちらが正しいですか?

基本的に、参照キューに関して弱い参照とファントム参照の違いを知りたいですか?

4

1 に答える 1

9

ReferenceQueue:

WeakReference と PhantomReference はどちらも、作成時に null 以外の参照キューが登録されている場合、それらの参照先 (参照されるオブジェクト) が強く到達できない後にキューに入れられます。

エンキューのために渡される前に、WeakReference は参照先フィールドをクリア (無効化) して、参照先を完全に到達不能にします。WeakReference がクリアされると、アプリケーションは参照先を get() できなくなります。つまり、後で WeakReference がキューに入れられると、get() は null を返します。WeakReference には、作成時に参照キューが登録されていない場合があります。アプリケーションは、get() を実行することで、参照先が到達不能かどうかを検出できます。アプリケーションが WeakReferences を明示的に管理したくない場合に、参照キューが WeakReferences を管理するのに便利な場合があります。

エンキューのために渡される前に、PhantomReference は参照先フィールドをクリアしません。エンキューされたとき、指示対象は引き続き PhantomReference によって参照されます。参照対象は、アプリケーションが参照キューをデキューした後にのみ、アプリケーションによって明示的にクリアされます。アプリケーションがそれをクリアしない場合、指示対象とその PhantomReference の両方が一緒に再利用されるまで、指示対象はそこに残ります。いずれにせよ、PhantomReference の get() は、クリアされていなくても常に null を返します。そのため、アプリケーションは get() を実行しても参照先が到達不能かどうかを検出できません。アプリケーションは、PhantomReference がキューに入れられているかどうかを確認することによってのみ、それを検出できます。このため、参照キューを登録して PhantomReference を作成する必要があります。そうでなければ、それは役に立たない。

ファイナライズ時:

WeakReference がクリアされると、リファレントに到達できなくなります。指示対象にデフォルト以外のファイナライザーがある場合、それはファイナライズの対象となるため、復活します。指示対象にデフォルト以外のファイナライザーがない場合、GC によって再利用される可能性があります。つまり、WeakReferences はファイナライズの前に処理されます。

PhantomReference の指示対象が PhantomReference を介してのみ到達可能である場合、それはまだファントム的に到達可能ではありません。ファイナライズ後もそのままである場合 (PhantomReference を介してのみ到達可能) にのみ、ファントム的に到達可能です。つまり、PhantomReferences はファイナライズ後に処理されます。ファイナライズによって復活しない指示対象のみがファントム到達可能であるため、確実に死亡します。しかしそれ以降、PhantomReference はキューに入れられるため、これらの参照先はまだ死んでいません。アプリケーションによって PhantomReferences が後でクリアされるか、PhantomReferences 自体が到達不能になった場合にのみ、PhantomReferences とそのリファレントが一緒に再利用可能になります。

于 2015-10-16T03:13:01.660 に答える