概念
- 每種編程語(yǔ)言都有自己操作內(nèi)存中元素的方式查牌,例如在 C 和 C++ 里是通過指針蚜点,而在 Java 中則是通過“引用”。
- 在對(duì)Java引用數(shù)據(jù)類型對(duì)象進(jìn)行操作時(shí)先誉,使用的標(biāo)識(shí)符實(shí)際上是內(nèi)存對(duì)象的一個(gè)引用(reference)湿刽。
- Java 中的垃圾回收機(jī)制在判斷是否回收某個(gè)對(duì)象的時(shí)候,都需要依據(jù)“引用”這個(gè)概念褐耳。
- 一個(gè)對(duì)象只有“已被引用”和 "未被引用"兩種狀態(tài)诈闺,為方便內(nèi)存回收,所以在JDK1.2后铃芦,將引用分為了四種類型雅镊;
-
強(qiáng)引用把曼、軟引用、弱引用漓穿、虛引用嗤军。引用強(qiáng)度依次減弱。
強(qiáng)引用 Strong Reference
- Java中默認(rèn)聲明的就是強(qiáng)引用晃危,=號(hào)賦值叙赚。
- 垃圾回收器將永遠(yuǎn)不會(huì)回收被引用的對(duì)象,哪怕內(nèi)存不足時(shí)僚饭,JVM也會(huì)直接拋出OutOfMemoryError震叮,不會(huì)去回收。
- 顯示的將強(qiáng)引用賦值為null鳍鸵,可以切斷強(qiáng)引用與對(duì)象之間的聯(lián)系苇瓣,垃圾回收器將回收內(nèi)存
Object obj = new Object(); //只要obj還指向Object對(duì)象,Object對(duì)象就不會(huì)被回收
obj = null; //手動(dòng)置null
軟引用 Soft Reference
- 在內(nèi)存足夠的時(shí)候偿乖,軟引用對(duì)象不會(huì)被回收击罪,只有在內(nèi)存不足時(shí),系統(tǒng)則會(huì)回收軟引用對(duì)象贪薪,如果回收了軟引用對(duì)象之后仍然沒有足夠的內(nèi)存媳禁,才會(huì)拋出內(nèi)存溢出異常。
- 這種特性常常被用來實(shí)現(xiàn)緩存技術(shù)画切,比如網(wǎng)頁(yè)緩存竣稽,圖片緩存等。
SoftReference<類型名稱> sr = new SoftReference<>(對(duì)象名稱);
byte[] buff = new byte[1024 * 1024];
SoftReference<byte[]> sr = new SoftReference<>(buff);
弱引用 Weak Reference
- 弱引用的引用強(qiáng)度比軟引用要更弱一些
- 無論內(nèi)存是否足夠霍弹,只要 JVM 開始進(jìn)行垃圾回收毫别,那些被弱引用關(guān)聯(lián)的對(duì)象都會(huì)被回收。
WeakReference<類型名稱> sr = new WeakReference<>(對(duì)象名稱);
byte[] buff = new byte[1024 * 1024];
WeakReference<byte[]> sr = new WeakReference<>(buff);
虛引用 Phantom Reference
- 虛引用是最弱的一種引用關(guān)系
- 如果一個(gè)對(duì)象僅持有虛引用典格,那么它就和沒有任何引用一樣岛宦,它隨時(shí)可能會(huì)被回收
- 它的 get() 方法僅僅是返回一個(gè)null,也就是說將永遠(yuǎn)無法通過虛引用來獲取對(duì)象
- 虛引用必須要和 ReferenceQueue 引用隊(duì)列一起使用钝计。
引用隊(duì)列 ReferenceQueue
- 當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí)恋博,如果發(fā)現(xiàn)它還有引用,那么就會(huì)在回收對(duì)象之前私恬,把這個(gè)引用加入到與之關(guān)聯(lián)的引用隊(duì)列中去。程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了引用炼吴,來判斷被引用的對(duì)象是否將要被垃圾回收本鸣,這樣就可以在對(duì)象被回收之前采取一些必要的措施。