- 強(qiáng)引用:
我們平時(shí)最常使用的基本對(duì)象引用,JVM不會(huì)回收強(qiáng)引用類型對(duì)象,即使內(nèi)存不足導(dǎo)致OOM也不會(huì)回收。
實(shí)現(xiàn)一個(gè)強(qiáng)引用
User user = new User()
- 軟引用:
內(nèi)存空間足夠的情況下,JVM不會(huì)回收軟引用對(duì)象,如果內(nèi)存空間不足,那么軟引用對(duì)象會(huì)被回收。
只要JVM沒(méi)有回收,軟引用就可以繼續(xù)被程序使用,因此可以用軟引用存放一些內(nèi)存敏感的緩存。只要內(nèi)存足夠,對(duì)象就保持永遠(yuǎn)不被回收。
實(shí)現(xiàn)軟引用:java.lang.ref.SoftReference
SoftRenference softRenfernce = new SoftRenference(new User());
// 獲取軟引用對(duì)象
System.out.println(softReference.get())
- 弱引用:垃圾回收線程只要掃描到弱引用對(duì)象,不管內(nèi)存空間是否足夠,都會(huì)進(jìn)行回收。
弱引用可以用來(lái)實(shí)現(xiàn)一些規(guī)范化映射,如:WeakHashMap,當(dāng)key或者value不再被引用時(shí)可以自動(dòng)回收。
實(shí)現(xiàn)一個(gè)弱引用:java.lang.ref.WeakReference
WeakReference weakReference = new WeakReference(new User());
System.out.println(weakReference.get())
- 虛引用:虛引用不決定對(duì)象的生命周期,如果一個(gè)對(duì)象僅持有虛引用,那么他就和沒(méi)有任何引用一樣,任何時(shí)候都可以被JVM回收。
虛引用主要用來(lái)跟蹤對(duì)象被垃圾回收器回收的話,虛引用必須和引用隊(duì)列(ReferenceQuque)聯(lián)合使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)他還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之前關(guān)聯(lián)的引用隊(duì)列。
實(shí)現(xiàn)一個(gè)虛引用:java.lang.ref.ReferenceQueue
// 引用隊(duì)列
ReferenceQueue<User> queue = new ReferenceQueue<> ();
// 構(gòu)建虛引用對(duì)象
PhantomReference phantomReference = new PhantomReference(new User());
// 獲取虛引用對(duì)象
System.out.println(phantomReference .get())
ReferenceQueue(引用隊(duì)列)是必須的,當(dāng)對(duì)象回收時(shí)會(huì)放入其中,它最大的作用是跟中對(duì)象的回收。