1. 程式人生 > >java 強弱軟虛 四種引用,以及用到的場景。

java 強弱軟虛 四種引用,以及用到的場景。

在JDK1.2後,java對引用的概念進行了擴充。按照引用強度依次從強到弱分為:強引用軟引用(SoftReference)、弱引用(WeakReference)、虛引用(PhantomReference)用四種。

強引用:最常見的,不會被GC回收的物件,如 Object obj = new Object();

軟引用:可有可無的物件,如果記憶體空間足夠,GC就不會去回收這個物件,如果記憶體不足,就會回收,軟引用可有和ReferenceQueue(引用佇列)聯合使用,如果軟引用所引用的物件唄GC回收,JVM就會把這個軟引用加入到引用佇列中。

public static void soft() throws Exception{
		Object obj = new Object();
		ReferenceQueue rq = new ReferenceQueue<>();
		SoftReference sr = new SoftReference(obj, rq);//建立關於obj的軟引用,使用引用佇列
		System.out.println(sr.get());//get方法會輸出這個obj物件的hashcode
		System.out.println(rq.poll());//輸出為null
		obj = null;
		System.gc();
		Thread.sleep(200);//因為finalizer執行緒優先順序很低,所以讓執行緒等待200ms
		System.out.println(sr.get());//因為堆空間沒滿,可有可無的特性,所以還是會輸出這個obj物件的hashcode
		
		System.out.println(rq.poll());//自然佇列為null
	}


弱引用:也是描述可有可無的物件,和軟引用不同的是,它的生命週期更短,在GC的過程中,一旦發現有弱引用的物件,不管當前記憶體空間是否足夠,都會回收它的記憶體。 真是因為這個特性,所以弱引用常用於Map資料結構中,引用佔用空間記憶體較大的物件。

public static void weak() throws Exception{
		Object obj = new Object();
		ReferenceQueue rq = new ReferenceQueue<>();
		WeakReference wr = new WeakReference(obj,rq);
		System.out.println(wr.get());
		System.out.println(rq.poll());
		obj = null;
		System.gc();
		Thread.sleep(200);
		System.out.println(wr.get());//這時候會輸出null
		System.out.println(rq.poll());//rq佇列裡也會存放這個弱引用,輸出它的hashcode
	}


虛引用:也成幽靈引用,他的構造方法必須傳遞RefenceQueue引數,當GC準備回收一個物件時,發現它還有虛引用,就會在回收前,把虛引用加入到引用佇列中,程式可以通過判斷佇列中是否加入虛引用來判斷被引用的物件是否將要GC回收,從而可以在finalize方法中採取措施。