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」をご参照ください。