1. 程式人生 > >Android 強引用,弱引用,軟引用,虛引用

Android 強引用,弱引用,軟引用,虛引用

轉載請註明出處: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
結束