8.1 Java の弱い参照
Java にはいくつかの種類の参照があります。
StrongReferenceがあります。これらは私たちが毎日作成する最も一般的なリンクです。
Object object = new Object();//created an object
object = null;//can now be garbage collected
そして、SoftReference、WeakReference、PhantomReference という 3 つの「特別な」タイプのリンクがあります。実際、すべてのタイプのリンク間には 1 つだけ違いがあります。それは、リンクが参照するオブジェクトに対する GC の動作です。各リンク タイプの詳細については後ほど詳しく説明しますが、現時点では次の知識があれば十分です。
- SoftReferenceはソフト参照です。オブジェクトがソフト参照のチェーンを通じてのみアクセス可能であると GC が判断した場合、そのオブジェクトはメモリから削除されます。多分。
- WeakReference - 弱い参照。オブジェクトが弱い参照のチェーンを通じてのみアクセス可能であると GC が判断した場合、そのオブジェクトをメモリから削除します。
- PhantomReferenceはファントム参照です。オブジェクトがファントム参照のチェーンを通じてのみ利用可能であると GC が判断した場合、そのオブジェクトはメモリから削除されます。GC を数回実行した後。
リンク タイプにはある程度の柔軟性があるとも言えます。
- 通常のハード リンクは、参照型の変数です。使用されなくなる前にガベージ コレクターによってクリーンアップされません。
- ソフトリファレンス。このオブジェクトによってすべてのメモリが使い果たされることはありません。OutOfMemoryError が発生する前に削除されることが保証されています。ガベージ コレクターの実装によっては、もっと早くなる可能性があります。
- 弱い参照。弱いソフト。オブジェクトの破棄は妨げられません。ガベージ コレクターはそのような参照を無視します。
- ファントムリファレンス。オブジェクトの「終了」処理に使用されます。オブジェクトはファイナライズ後、ガベージ コレクションされるまで使用できます。
違いがまだ明確でない場合でも、心配する必要はありません。すぐにすべてが適切な位置に収まります。詳細は詳細に記載されており、詳細は後述します。
8.2 Java の WeakReference と SoftReference
まず、Java におけるWeakReferenceとSoftReferenceの違いを見てみましょう。
つまり、ガベージ コレクターは、弱い参照のみがオブジェクトを指している場合、そのオブジェクトのメモリを解放します。オブジェクトが SoftReferences によってポイントされている場合、JVM がメモリを緊急に必要とするときにメモリの割り当てが解除されます。
これにより、場合によっては、SoftReference がStrong Reference よりも明らかに有利になります。たとえば、SoftReference はアプリケーション キャッシュの実装に使用されるため、JVM が最初に行うことは、SoftReference のみが指すオブジェクトを削除することです。
WeakReference は、ClassLoader への参照の保存など、メタデータの保存に最適です。クラスがロードされていない場合は、ClassLoader を参照しないでください。これが、WeakReference を使用すると、ガベージ コレクターが ClassLoader への最後の強い参照が削除されるとすぐにその作業を実行できるようにする理由です。
Java での WeakReference の例:
// some object
Student student = new Student();
// weak reference to it
WeakReference weakStudent = new WeakReference(student);
// now the Student object can be garbage collected
student = null;
Java での SoftReference の例:
// some object
Student student = new Student();
// weak reference to it
SoftReference softStudent = new SoftReference(student)
// now the Student object can be garbage collected
// but this will only happen if the JVM has a strong need for memory
student = null;
8.3 Java の PhantomReference
PhantomReference インスタンスは WeakReference および SoftReference の例と同じ方法で作成されますが、使用されることはほとんどありません。
オブジェクトに強い (Strong)、弱い (WeakReference)、またはソフト (SoftReference) 参照がない場合、PhantomReference はガベージ コレクションされる可能性があります。
次のようにファントム参照オブジェクトを作成できます。
PhantomReference myObjectRef = new PhantomReference(MyObject);
PhantomReference は、 finalize() が意味をなさない状況で使用できます。この参照型は、オブジェクトにアクセスするように設計されていないため、他の型とは異なります。これは、オブジェクトがすでにファイナライズされており、ガベージ コレクターがそのメモリを再利用する準備ができていることを示す信号です。
これを行うために、ガベージ コレクターは、さらなる処理のためにそれを特別なReferenceQueueに置きます。ReferenceQueue は、メモリを解放するためにオブジェクト参照が配置される場所です。
ファントム参照は、オブジェクトがメモリから削除されたことを知るための安全な方法です。たとえば、大きな画像を扱うアプリケーションを考えてみましょう。画像がすでにメモリ内にあり、ガベージ コレクションの準備ができているときに、画像をメモリにロードしたいとします。この場合、新しいイメージをメモリにロードする前に、ガベージ コレクターが古いイメージを強制終了するのを待ちます。
ここでは、PhantomReference が柔軟で安全な選択です。古いイメージへの参照は、古いイメージ オブジェクトが破棄された後に ReferenceQueue に渡されます。このリンクを取得したら、新しい画像をメモリにロードできます。
GO TO FULL VERSION