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

WeakReference (Java SE 16 & JDK 16)の使用例まとめです。
だいたいのメソッドを網羅済みです。
公式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」をご参照ください。


関連記事

ページの先頭へ