從JDK1.2版本開(kāi)始铐然,把對(duì)象的引用分為四種級(jí)別童芹,從而使程序能更加靈活的控制對(duì)象的生命周期。這四種級(jí)別由
高到低依次為:強(qiáng)引用绣版、軟引用毕莱、弱引用和虛引用扮念。
1. 強(qiáng)引用(Strong Reference)
強(qiáng)引用是指創(chuàng)建一個(gè)對(duì)象并把這個(gè)對(duì)象賦給一個(gè)引用變量。
比如:
Object object =newObject();
String str ="hello";
強(qiáng)引用有引用變量指向時(shí)永遠(yuǎn)不會(huì)被垃圾回收,JVM寧愿拋出OutOfMemory錯(cuò)誤也不會(huì)回收這種對(duì)象奉芦。
如果一個(gè)對(duì)象具有軟引用疚漆,內(nèi)存空間足夠桂敛,垃圾回收器就不會(huì)回收它缀遍;
如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存杭朱。只要垃圾回收器沒(méi)有回收它阅仔,該對(duì)象就可以被程序使用。
SoftReference<T>? soft = new SoftReference<T>(obj);
作為一個(gè)Java對(duì)象弧械,SoftReference對(duì)象除了具有保存軟引用的特殊性之外八酒,也具有Java對(duì)象的一般性。所以刃唐,當(dāng)軟可及對(duì)象被回收之后羞迷,雖然這個(gè)SoftReference對(duì)象的get()方法返回null,但這個(gè)SoftReference對(duì)象已經(jīng)不再具有存在的價(jià)值,需要一個(gè)適當(dāng)?shù)那宄龣C(jī)制唁桩,避免大量SoftReference對(duì)象帶來(lái)的內(nèi)存泄漏闭树。在java.lang.ref包里還提供了ReferenceQueue。如果在創(chuàng)建SoftReference對(duì)象的時(shí)候荒澡,使用了一個(gè)ReferenceQueue對(duì)象作為參數(shù)提供給SoftReference的構(gòu)造方法报辱,如:
ReferenceQueue queue = new? ReferenceQueue();
SoftReference? ref = new? SoftReference(obj, queue);
那么當(dāng)這個(gè)SoftReference所軟引用的aMyOhject被垃圾收集器回收的同時(shí),ref所強(qiáng)引用的SoftReference對(duì)象被列入ReferenceQueue单山。也就是說(shuō)碍现,ReferenceQueue中保存的對(duì)象是Reference對(duì)象,而且是已經(jīng)失去了它所軟引用的對(duì)象的Reference對(duì)象米奸。另外從ReferenceQueue這個(gè)名字也可以看出昼接,它是一個(gè)隊(duì)列,當(dāng)我們調(diào)用它的poll()方法的時(shí)候悴晰,如果這個(gè)隊(duì)列中不是空隊(duì)列慢睡,那么將返回隊(duì)列前面的那個(gè)Reference對(duì)象逐工。
在任何時(shí)候,我們都可以調(diào)用ReferenceQueue的poll()方法來(lái)檢查是否有它所關(guān)心的非強(qiáng)可及對(duì)象被回收漂辐。如果隊(duì)列為空泪喊,將返回一個(gè)null,否則該方法返回隊(duì)列中前面的一個(gè)Reference對(duì)象。利用這個(gè)方法髓涯,我們可以檢查哪個(gè)SoftReference所軟引用的對(duì)象已經(jīng)被回收袒啼。于是我們可以把這些失去所軟引用的對(duì)象的SoftReference對(duì)象清除掉。常用的方式為:
SoftReference ref = null;
while ((ref = (EmployeeRef) q.poll()) != null) {
? ? // 清除ref
}
弱引用也是用來(lái)描述非必需對(duì)象的纬纪,當(dāng)JVM進(jìn)行垃圾回收時(shí)蚓再,無(wú)論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象包各。在java中摘仅,用java.lang.ref.WeakReference類來(lái)表示。
虛引用和前面的軟引用髓棋、弱引用不同实檀,它并不影響對(duì)象的生命周期惶洲。在java中用java.lang.ref.PhantomReference類表示按声。如果一個(gè)對(duì)象與虛引用關(guān)聯(lián),則跟沒(méi)有引用與之關(guān)聯(lián)一樣恬吕,在任何時(shí)候都可能被垃圾回收器回收签则。
要注意的是,虛引用必須和引用隊(duì)列關(guān)聯(lián)使用铐料,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)渐裂,如果發(fā)現(xiàn)它還有虛引用,就會(huì)把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中钠惩。程序可以通過(guò)判斷引用隊(duì)列中是否已經(jīng)加入了虛引用柒凉,來(lái)了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列篓跛,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)膝捞。