新聞中心
一位工作4年的小伙伴面試被問(wèn)到這樣一道題,說(shuō)Java中,4種對(duì)象引用之間的區(qū)別是什么?這道面試題問(wèn)得比較偏門(mén),更多應(yīng)用在一些底層類(lèi)庫(kù)或者是框架中,涉及到的知識(shí)點(diǎn)包括JVM、GC等,一般人確實(shí)很少關(guān)注。

Java中的4種引用類(lèi)型主要是指強(qiáng)、軟、弱、虛,
它們主要是體現(xiàn)對(duì)象不同的可達(dá)性狀態(tài)和對(duì)GC的影響。下面我給大家詳細(xì)地分析一下我對(duì)這四種引用類(lèi)型的理解。
1、強(qiáng)引用:只要引用關(guān)系還在,對(duì)象就永遠(yuǎn)不會(huì)被回收。
其實(shí)就是指普通對(duì)象的引用,只要還有引用關(guān)系存在,就表示對(duì)象還活著,垃圾收集器無(wú)法回收這一類(lèi)對(duì)象。只有在沒(méi)有其他引用關(guān)系或者超過(guò)引用作用域,再或者是將對(duì)象引用強(qiáng)制賦值為null的情況下,垃圾收集器才會(huì)去回收這個(gè)對(duì)象。
2、軟引用:非必須存活的對(duì)象,JVM會(huì)在內(nèi)存溢出前對(duì)其進(jìn)行回收。
是一種相對(duì)于強(qiáng)引用來(lái)說(shuō)弱一些的引用??梢宰寣?duì)象豁免一些垃圾收集的操作。只有當(dāng)JVM判斷內(nèi)存不足的時(shí)候,才會(huì)試圖回收引用指向的對(duì)象。那軟引用通常是用來(lái)實(shí)現(xiàn)內(nèi)存敏感的一些緩存,如果還有空閑內(nèi)存就可以暫時(shí)保留緩存,當(dāng)內(nèi)存不足的時(shí)候會(huì)清理掉。這樣就可以保證使用緩存的同時(shí),不會(huì)耗盡內(nèi)存。
3、弱引用:非必須存活的對(duì)象,不管內(nèi)存是否夠用,下次GC一定回收。
弱引用是相對(duì)于強(qiáng)引用而言的,它是允許存在引用關(guān)聯(lián)的情況下,能被垃圾回收的對(duì)象。在垃圾回收器線(xiàn)程掃描它所管轄的內(nèi)存區(qū)域的過(guò)程中,一旦發(fā)現(xiàn)只具有弱引用的對(duì)象的時(shí)候,不管當(dāng)前的內(nèi)存空間是否足夠,垃圾回收器都會(huì)回收這個(gè)內(nèi)存。
4、虛引用:等同于沒(méi)有引用,對(duì)象被回收時(shí)會(huì)收到通知。
虛引用不會(huì)決定對(duì)象的生命周期,它提供一種確保對(duì)象被finalize以后,去做某些事情的機(jī)制。當(dāng)垃圾回收期準(zhǔn)備去回收一個(gè)對(duì)象的時(shí)候,如果發(fā)現(xiàn)他還有虛引用,就會(huì)在回收對(duì)象的內(nèi)存之前,把這個(gè)虛引用加入到與之關(guān)聯(lián)的引用隊(duì)列中,程序可以通過(guò)判斷引用隊(duì)列是否已經(jīng)加入虛引用,來(lái)決定被引用對(duì)象是否要被垃圾回收器回收。然后,我們就可以在引用對(duì)象被回收之前執(zhí)行一些必要的操作。所以,虛引用必須和引用隊(duì)列一起使用,
以上的分享還是比較官方,舉個(gè)通俗例子,大家就會(huì)更容易理解。
- 強(qiáng)引用就好比電視劇中的男主角,怎么都死不了。
- 軟引用就像女主角,雖有一段經(jīng)歷,還是沒(méi)走到最后。
- 弱引用就是男二號(hào),注定用來(lái)犧牲的。
- 虛引用就是路人甲了。
以上就是我對(duì)Java中4種引用對(duì)象的理解。有興趣的小伙伴,可以更進(jìn)一步去研究一下。
網(wǎng)站名稱(chēng):四種對(duì)象引用之間的區(qū)別是什么?你知道嗎?
分享URL:http://fisionsoft.com.cn/article/cosiseg.html


咨詢(xún)
建站咨詢(xún)
