Javaの参照は、JDK1.2から強い参照、ソフト参照、弱い参照、虚参照の4つのレベルに分類されています。参照の強さに応じて、ガベージコレクションの優先度が異なります。 優先度の順序は強い参照 > ソフト参照 > 弱い参照 > 虚参照です。 参照の強さは、オブジェクトの有効性分析に影響を与えます。有効性 = 可達性 + 参照の種類。
- 強い参照 (Strong Reference) 強い参照は、最も一般的な参照です。強い参照を持つオブジェクトは、ガベージコレクションが絶対に回収しません。仮にメモリ不足の場合でも、強い参照を持つオブジェクトを回収せずにOutOfMemoryErrorを投げます。
Person person = new Person(); // 強い参照
- ソフト参照 (Soft Reference) ソフト参照は、有用だが必須ではないオブジェクトを表します。メモリが十分なときは回収されませんが、メモリ不足になると回収される可能性があります。 ソフト参照は、キャッシュの実装に役立ちます。 ソフト参照は、参照キューと組み合わせて使用できます。ソフト参照の対象オブジェクトが回収されると、その参照は関連付けられたキューに追加されます。
Person person = new Person();
SoftReference<Person> softRef = new SoftReference<>(person);
- 弱い参照 (Weak Reference) 弱い参照は、可能性のある有用性を持つオブジェクトを表します。弱い参照を持つオブジェクトは、すぐに回収されることがほとんどです。 弱い参照も、参照キューと組み合わせて使用できます。
Person person = new Person();
WeakReference<Person> weakRef = new WeakReference<>(person);
- 虚参照 (Phantom Reference) 虚参照は、無用な状態にあるオブジェクトを表します。虚参照を持つオブジェクトは、いつでも回収される可能性があります。 虚参照の特徴は、参照キューとの組み合わせです。虚参照の対象オブジェクトが回収される際、その参照はキューに追加されます。
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(object, queue);
- ソフト参照を用いたキャッシュの例 ソフト参照は、メモリの使用状況に応じて柔軟にオブジェクトを管理するのに適しています。 例えば、Webアプリケーションのページキャッシュをソフト参照で管理すると、以下のようなメリットがあります:
- ページが再利用される可能性があれば、ソフト参照で保持します。
- メモリ不足になると、不要なページが優先的に回収されます。
MyData data = new MyData();
SoftReference<MyData> softRef = new SoftReference<>(data);
data = null; // 強い参照を解除
MyData restoredData = softRef.get();
- 参照キューを用いたソフト参照のクリーンアップ ソフト参照が回収された後、参照キューを用いて不要になったSoftReferenceオブジェクトを削除できます。
ReferenceQueue<Object> queue = new ReferenceQueue<>();
SoftReference<Object> ref = new SoftReference<>(object, queue);
SoftReference<Object> removedRef = null;
while ((removedRef = queue.poll()) != null) {
// 削除された参照をクリーンアップ
}