- Java中的值傳遞和引用傳遞:http://www.reibang.com/p/6d0f7258f2e0
** 深入理解引用 **
問(wèn):底層怎么實(shí)現(xiàn)的谦趣?
答:由于reference類(lèi)型在Java虛擬機(jī)規(guī)范里面只規(guī)定了一個(gè)指向?qū)ο蟮囊玫嗄梗](méi)有定義這個(gè)引用應(yīng)該通過(guò)哪種方式去定位,以及訪問(wèn)到Java堆中的對(duì)象的具體位置肥印,因此不同虛擬機(jī)實(shí)現(xiàn)的對(duì)象訪問(wèn)方式會(huì)有所不同,主流的訪問(wèn)方式有兩種:使用句柄池和直接使用指針排监。
Java的四種引用捻艳,強(qiáng)弱軟虛,用到的場(chǎng)景比驻。
JDK1.2之前只有強(qiáng)引用,其他幾種引用都是在JDK1.2之后引入的.
** 強(qiáng)引用 **(Strong Reference) 最常用的引用類(lèi)型该溯,如Object obj = new Object(); 。只要強(qiáng)引用存在則GC時(shí)則必定不被回收别惦。** 軟引用 **(Soft Reference) 用于描述還有用但非必須的對(duì)象狈茉,當(dāng)堆將發(fā)生OOM(Out Of Memory)時(shí)則會(huì)回收軟引用所指向的內(nèi)存空間,若回收后依然空間不足才會(huì)拋出OOM步咪。一般用于實(shí)現(xiàn)內(nèi)存敏感的高速緩存论皆。 當(dāng)真正對(duì)象被標(biāo)記finalizable以及的finalize()方法調(diào)用之后并且內(nèi)存已經(jīng)清理, 那么如果SoftReference object還存在就被加入到它的 ReferenceQueue.只有前面幾步完成后,Soft Reference和Weak Reference的get方法才會(huì)返回null
** 弱引用 **(Weak Reference) 發(fā)生GC時(shí)必定回收弱引用指向的內(nèi)存空間益楼。 和軟引用加入隊(duì)列的時(shí)機(jī)相同
** 虛引用 **(Phantom Reference) 又稱(chēng)為幽靈引用或幻影引用猾漫,虛引用既不會(huì)影響對(duì)象的生命周期,也無(wú)法通過(guò)虛引用來(lái)獲取對(duì)象實(shí)例感凤,僅用于在發(fā)生GC時(shí)接收一個(gè)系統(tǒng)通知悯周。 當(dāng)一個(gè)對(duì)象的finalize方法已經(jīng)被調(diào)用了之后,這個(gè)對(duì)象的幽靈引用會(huì)被加入到隊(duì)列中陪竿。通過(guò)檢查該隊(duì)列里面的內(nèi)容就知道一個(gè)對(duì)象是不是已經(jīng)準(zhǔn)備要被回收了. 虛引用和軟引用和弱引用都不同,它會(huì)在內(nèi)存沒(méi)有清理的時(shí)候被加入引用隊(duì)列.虛引用的建立必須要傳入引用隊(duì)列,其他可以沒(méi)有