JAva弱参照
3407 ワード
JAvaリファレンスは、強、軟、弱、虚に分けられます
強いリファレンス、すなわち通常作成されたオブジェクトからのリファレンスであり、1つのオブジェクトに強いリファレンスが存在する場合、GCによって回収されません.
ただし、オブジェクトがソフトリファレンスまたは弱リファレンスのみの場合、GCが発生すると
ソフトリファレンス:メモリが不足している場合はリサイクル
弱いリファレンス:メモリが十分かどうかにかかわらず、リサイクル
ここでは主に弱いリファレンスの使用方法をまとめます.弱いリファレンスオブジェクトが回収されると、オブジェクトが回収され、リファレンスがキューに入れられ、このキューの弱いリファレンスを取得し、クリーンアップ動作を行うことができます.
WeakHashMapクラスは、keyが強く参照されていない場合、GCが発生するとオブジェクトが消去されることに注目する必要があります.
強いリファレンス、すなわち通常作成されたオブジェクトからのリファレンスであり、1つのオブジェクトに強いリファレンスが存在する場合、GCによって回収されません.
ただし、オブジェクトがソフトリファレンスまたは弱リファレンスのみの場合、GCが発生すると
ソフトリファレンス:メモリが不足している場合はリサイクル
弱いリファレンス:メモリが十分かどうかにかかわらず、リサイクル
ここでは主に弱いリファレンスの使用方法をまとめます.弱いリファレンスオブジェクトが回収されると、オブジェクトが回収され、リファレンスがキューに入れられ、このキューの弱いリファレンスを取得し、クリーンアップ動作を行うことができます.
public class WearkRefTest {
static class WeakReferenceExt extends WeakReference {
public WeakReferenceExt(String referent, ReferenceQueue rq) {
super(referent, rq);
}
public void clean() {
System.out.println("do some cleaning");
}
}
public static void main(String[] args) throws InterruptedException {
//
char[] chars = new char[1024 << 16];
Arrays.fill(chars, 'z');
String str = new String(chars);
//
ReferenceQueue rq = new ReferenceQueue();
WeakReference weak = new WeakReferenceExt(str, rq);
str = null;
System.out.println(((String)weak.get()).length());
// GC, GC , ,
System.gc();
System.out.println("-------------");
// ,
WeakReferenceExt remove = (WeakReferenceExt)rq.remove();
//
remove.clean();
//
System.out.println(((String)weak.get()).length());
}
}
WeakHashMapクラスは、keyが強く参照されていない場合、GCが発生するとオブジェクトが消去されることに注目する必要があります.