三種 reference類
在jvm中,如果有引用指向該物件,則該物件是可獲得的(reachable),意味著你在棧中有一個普通的引用指向該物件。GC無法回收這種物件。如果你想使用一個物件,同時希望在記憶體不夠時候,gc可以回收該物件。解決方案就是引用物件,java.lang.ref:
- WeakReference(實現規範對映,只要gc就開始回收。有WeakHashMap的應用)
Person p1=new Person();
//1.建立可選的佇列,可以在gc回收該物件後,放到該佇列。
ReferenceQueue<Person> refQueue = new ReferenceQueue<Person>();
//2.建立WeakReference物件,引數實際物件+佇列
WeakReference wr=new WeakReference(p1,refQueue);
//獲取物件的方式,
System.out.println(wr.get());
System.out.println(refQueue.poll());
p1=null;
//gc之後物件被回收了,進入到了佇列了。
System.gc();
System.out.println("after gc()");
System.out.println(wr.get());
System.out.println(refQueue.poll());
執行結果:
thinkinginstring.Person@6e0be858
null
after gc()
null
java.lang.ref.WeakReference@61bbe9ba
複製程式碼
- PhantomReference(用以排程回收前的清理工作,比finalize更靈活)
Person p1=new Person();
ReferenceQueue<Person> refQueue = new ReferenceQueue<Person>();
PhantomReference pr=new PhantomReference(p1,refQueue);
System.out.println(pr.get());
System.out.println(refQueue.poll());
p1=null;
System.gc();
System.out.println(pr.get());
System.out.println(refQueue.poll());
執行結果:
null
null
null
java.lang.ref.PhantomReference@6e0be858
複製程式碼
Once the garbage collector decides that an object obj is phantom-reachable, it is being enqueued on the corresponding queue, but its referent is not cleared. That is, the reference queue of the phantom reference must explicitly be processed by some application code. 一旦GC決定一個“obj”是虛可達的,它(指PhantomReference)將會被入隊到對應的佇列,但是它的指代並沒有被清除。也就是說,虛引用的引用佇列一定要明確地被一些應用程式程式碼所處理。
- SoftReference(記憶體不足時才開始回收,記憶體敏感的快取記憶體)