広告

Java : WeakReference (弱参照) - API使用例

WeakReference (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

弱参照オブジェクトです。弱参照オブジェクトは、その弱参照オブジェクトのリファレントがファイナライズ可能になり、ファイナライズされ、そして再生されることを阻止することはありません。

クラス構成

WeakReferenceクラスは、対象となるオブジェクトの弱参照を作ります。
弱参照は GC によるオブジェクトのクリアを妨げません。

対象のオブジェクトがクリアされると、弱参照は null を返すようになります。

var sb = new StringBuilder("abcd");
final var ref = new WeakReference<>(sb);

System.out.println(ref.get()); // abcd

// 変数 sb による強参照が残っている状態です。
System.gc();
System.out.println(ref.get()); // abcd

// 変数 sb の強参照をクリアします。
sb = null;
System.out.println(ref.get()); // abcd

// その状態で、GCを要求します。
System.gc();
System.out.println(ref.get()); // null

補足

  • 本記事のコード例では、GCを実行するために System.gc メソッドを使っています。
  • しかし、一般的なJavaプログラムでは、System.gc を直接呼び出すことはあまりおすすめしません。
    Javaシステムが自分自身の最適なタイミングでGCを実行してくれるためです。

コンストラクタ

WeakReference (T referent)

指定されたオブジェクトを参照する、新しい弱参照を作成します。

var sb = new StringBuilder("abcd");
final var ref = new WeakReference<>(sb);

System.out.println(ref.get()); // abcd

sb = null;
System.out.println(ref.get()); // abcd

System.gc();
System.out.println(ref.get()); // null

WeakReference (T referent, ReferenceQueue<? super T> q)

指定されたオブジェクトを参照し、指定されたキューに登録されている新しい弱参照を作成します。

final var queue = new ReferenceQueue<StringBuilder>();

var sb = new StringBuilder("abcd");
final var ref = new WeakReference<>(sb, queue);

System.out.println(ref.get()); // abcd
System.out.println(queue.poll()); // null

sb = null;
System.out.println(ref.get()); // abcd
System.out.println(queue.poll()); // null

System.gc();
System.out.println(ref.get()); // null
System.out.println(queue.poll()); // java.lang.ref.WeakReference@6b2a628e

Referenceで宣言されたメソッド

clear, clone, enqueue, get, isEnqueued, reachabilityFence, refersTo

Java API 使用例 : Reference」をご参照ください。


関連記事

ページの先頭へ