8

ファントム リファレンスは事後分析に役立ちます。Java 仕様では、ファントム参照自体が消去されるまで、ファントム参照オブジェクトの割り当ては解除されないと規定されています。

私の質問は次のとおりです。この機能 (オブジェクトの割り当てが解除されていない) はどのような目的に役立ちますか?

(私が思いついた唯一のアイデアは、ネイティブ コードがオブジェクトの事後クリーンアップを実行できるようにすることですが、あまり説得力がありません)。

4

6 に答える 6

2

私が最初に質問を誤解したので、編集してください:

ここから引用http://www.memorymanagement.org/glossary/p.html

Java仕様では、参照オブジェクトがキューに入れられたときにファントム参照はクリアされないとされていますが、実際には、それが行われたかどうかを言語で判断する方法はありません。一部の実装では、JNIウィークグローバル参照はファントム参照よりも弱く、ファントム到達可能オブジェクトにアクセスする方法を提供します。

しかし、私は同じことを言う他の参考文献を見つけませんでした。

于 2008-09-17T07:38:38.630 に答える
1

アイデアは、元のオブジェクトが実行する以上に、他のオブジェクトに追加のクリーンアップを実行させることだと思います。たとえば、元のオブジェクトを拡張してファイナライズ関連のものを実装できない場合は、ファントム参照を使用できます。

より大きな問題は、JVMがオブジェクトがファイナライズされることを保証しないことです。拡張により、ファントム参照がファイナライズ後に機能することを保証しないと思います。

于 2008-09-17T07:42:39.683 に答える
1
ファントム参照を使用して、リソースの解放などのガベージ コレクション前のアクションを実行できます。代わりに、人々は通常、これに finalize() メソッドを使用しますが、これは良い考えではありません。ファイナライザーはガベージ コレクターのパフォーマンスに恐ろしい影響を与え、「ファイナライザー」はランダムなスレッドでランダムな時間に呼び出されるため、十分に注意しないと、アプリケーションのデータの整合性を損なう可能性があります。

ファントム参照のコンストラクターでは、参照されるオブジェクトが「ファントム到達可能」になると、ファントム参照がキューに入れられる ReferenceQueue を指定します。ファントム到達可能とは、ファントム参照以外では到達できないことを意味します。最初に紛らわしいのは、ファントム参照は参照されるオブジェクトをプライベート フィールドに保持し続けますが (ソフト参照や弱参照とは異なり)、その getReference() メソッドは常に null を返すことです。これは、オブジェクトを再び強力に到達可能にできないようにするためです。

時々、ReferenceQueue をポーリングして、参照されたオブジェクトがファントムに到達可能になった新しい PhantomReferences があるかどうかを確認できます。何か便利なことをできるようにするために、たとえば、ガベージ コレクションの前に解放する必要があるリソースを参照する java.lang.ref.PhantomReference からクラスを派生させることができます。参照されたオブジェクトは、ファントム参照自体が到達不能になった場合にのみガベージ コレクションされます。

http://www.javalobby.org/java/forums/m91822870.html#91822413

于 2008-09-17T14:52:44.127 に答える
1

私が考えることができる唯一の適切な使用例は、解放を防ぐために、ある種の JNI で実装された非同期データ ソースが参照されたオブジェクトに書き込みを行っており、停止するように (オブジェクトへの書き込みを停止するように) 指示する必要がある場合です。メモリがリサイクルされる前に。以前の割り当て解除が許可されていた場合、単純な「dispose() を忘れた」というバグにより、メモリが破損する可能性がありました。

これは、過去に finalize() が使用されたケースの 1 つであり、おそらくその癖のいくつかを引き起こしました。

于 2011-10-13T13:41:30.717 に答える
-2

これにより、メモリ管理で非常に効率的な2つのファントムキャッシュを使用できます。簡単に言うと、作成に費用がかかるがほとんど使用されない巨大なオブジェクトがある場合は、ファントムキャッシュを使用してそれらを参照し、より価値のあるメモリを使用しないようにすることができます。通常の参照を使用する場合は、オブジェクトへの参照が残っていないことを手動で確認する必要があります。どのオブジェクトについても同じように議論できますが、ファントムキャッシュ内の参照を手動で管理する必要はありません。それらが収集されたかどうかを確認するために注意する必要があります。

また、参照がファントム参照として与えられるフレームワーク(つまりファクトリ)を使用することもできます。これは、オブジェクトが多くて短命である(つまり、使用されてから廃棄される)場合に役立ちます。ガベージコレクションが魔法だと思っているずさんなプログラマーがいる場合は、メモリをクリアするのに非常に便利です。

于 2008-09-17T07:40:59.920 に答える