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