Android 強引用,弱引用,軟引用,虛引用
阿新 • • 發佈:2019-01-03
轉載請註明出處:http://blog.csdn.net/mr_liabill/article/details/48344483 來自《LiaBin的部落格》
基本概念
1. 強引用
以前我們使用的大部分引用實際上都是強引用,這是使用最普遍的引用。如果一個物件具有強引用,那就類似於必不可少的生活用品,垃圾回收器絕不會回收它。當記憶體空間不足,Java虛擬機器寧願丟擲OutOfMemoryError錯誤,使程式異常終止,也不會靠隨意回收具有強引用的物件來解決記憶體不足問題。
2.軟引用(SoftReference)
如果一個物件只具有軟引用,那就類似於可有可物的生活用品。如果記憶體空間足夠,垃圾回收器就不會回收它,如果記憶體空間不足了,就會回收這些物件的記憶體
3.弱引用(WeakReference)
如果一個物件只具有弱引用,那就類似於可有可物的生活用品。弱引用與軟引用的區別在於:只具有弱引用的物件擁有更短暫的生命週期。在垃圾回收器執行緒掃描它 所管轄的記憶體區域的過程中,一旦發現了只具有弱引用的物件,不管當前記憶體空間足夠與否,都會回收它的記憶體。不過,由於垃圾回收器是一個優先順序很低的執行緒, 因此不一定會很快發現那些只具有弱引用的物件。
4. 虛引用
用的比較少,就不管它了
例子
class Reference { private StringBuilder stringBuilder; public Reference() { stringBuilder = new StringBuilder("test"); } public StringBuilder getString() { return stringBuilder; } }
強引用舉例
Reference ref = new Reference();
Reference secondRef=ref;
ref=null;
此時Reference物件還有secodeRef強引用指向,所以即使發生GC也不會回收釋放弱引用舉例
public static void main(String[] args) { System.out.println("開始"); Reference ref = new Reference(); WeakReference<Reference> weakRef = new WeakReference<Reference>(ref); //引用置為null,只是把引用設定為null,指向的物件是否被回收需要看情況,如果沒有任何強引用指向, //那麼當發生GC的時候,無論如何該物件都會被回收。(如果有軟引用指向該物件,視情況是否回收) ref = null; System.gc();// 強制對系統進行GC,因為GC是不固定的,這個需要JVM排程,如果沒發生GC,那麼虛引用所指向的物件還是不會被回收,直到程式執行結束。 // 此時該物件沒有強引用指向它,只有虛引用指向這個物件,所以可以直接回收這個物件 // 如果此時是軟引用指向這個物件,然後發生GC,視情況決定是否回收這個物件,記憶體不足,回收,否則不回收 // SoftReference<A> weakA = new SoftReference<A>(a); //<span style="color:#33CC00;">即使呼叫System.gc();JVM也不一定會發生回收,不同JVM有不同的實現,這裡恰好發生了GC,所以產生了如下列印結果</span>。 Reference anoRef = weakRef.get(); if (anoRef == null) { //說明上面new的Reference已經JVM的GC回收 System.out.println("anoRef is null"); } else { //物件沒有被回收 System.out.println(anoRef.getString().toString()); } System.out.println("結束"); }
發生了GC,物件只有一個弱引用指向,所以回收釋放Reference物件
輸出:
開始
anoRef is null
結束
軟引用舉例
WeakReference<Reference> weakRef = new WeakReference<Reference>(ref);
替換為SoftReference<A> weakA = new SoftReference<A>(a);
此時物件只有一個軟引用指向,因為此時記憶體還很足夠,所以不回收Reference物件
輸出:
開始
test
結束