成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

連引用都答不上,憑什么說你是Java服務(wù)端開發(fā)

mozillazg / 3133人閱讀

摘要:弱引用弱引用比軟引用更弱,被弱引用關(guān)聯(lián)的對象只能存活到發(fā)生下一次垃圾回收之前,也就是說當(dāng)發(fā)生時(shí),無論當(dāng)前內(nèi)存是否足夠,都會被回收掉。這是最終的狀態(tài),不能再變?yōu)槠渌鼱顟B(tài)。如下圖所示對象都是可被回收的。

【干貨點(diǎn)】看完該篇文章,就基本可以解答面試熱點(diǎn)【談?wù)剬ava中幾種引用的理解】了。

大家都知道我公眾號的副業(yè)是

所以經(jīng)常會有朋友找我吹水,最近就說到了一個(gè)面試題

談?wù)剬ava中幾種引用的理解。

因此打算以該面試題為例子,寫篇文章說說在Java中引用是什么以及怎么用。
【劃重點(diǎn):給你三秒鐘時(shí)間思考,如果是你,該如何回答面試官的這個(gè)問題呢】

引用是什么

【劃重點(diǎn)】在Java中引用包括:

FinalReference 強(qiáng)引用

SoftReference 軟引用

WeakReference 弱引用

PhantomReference 虛引用

那么為什么會提供這四種引用呢,主要原因有:

方便Jvm進(jìn)行垃圾回收

方便開發(fā)人員使用,開發(fā)人員可以靈活的決定某些對象的生命周期

日常開發(fā)如何使用

學(xué)以致用,那么這幾個(gè)引用在日常中我們?nèi)绾芜M(jìn)行使用呢?
接下來我會給出相關(guān)demo?。。?/p> FinalReference 強(qiáng)引用

類似于 Object o = new Object() 這類的引用,創(chuàng)建一個(gè)對象后,該引用會被保存在JVM棧中,而且只要強(qiáng)引用存在,垃圾回收器就不會回收掉被引用的對象。

日常使用

強(qiáng)引用的例子比比皆是,因?yàn)樵谌粘i_發(fā)中我們是會經(jīng)常去new一個(gè)對象的,而該new出來的對象便是強(qiáng)引用的,也就是說只要該引用存在,垃圾回收器就不會回收掉。
【劃重點(diǎn):JVM怎么知道引用在不在?】

SoftReference 軟引用

軟引用關(guān)聯(lián)的對象,在內(nèi)存不夠的情況下,會把這些軟引用關(guān)聯(lián)的對象列入垃圾回收范圍中,然后進(jìn)行回收,也就是說軟引用并非是完全安全的,在內(nèi)存不夠的情況下是會被垃圾回收器回收掉的。

給出demo

通過注釋便可以知道,我這里實(shí)例化了多個(gè)大對象,然后放入softReferences數(shù)組中,之后便遍歷打印出其中的對象的命名,打印結(jié)果如下

可以通過結(jié)果看出,前面四個(gè)對象因?yàn)閮?nèi)存不夠而被垃圾回收器回收了。

日常使用

在我司的項(xiàng)目中,部分是使用軟引用來保存從數(shù)據(jù)庫中取出的數(shù)據(jù),具體是做了一個(gè)中間層的封裝,該中間層的作用就是在get出數(shù)據(jù)的時(shí)候會去判斷數(shù)據(jù)是否為null,如果是為null再次從數(shù)據(jù)庫讀取,讀取后再放入軟引用的集合中,這樣的做法是可以避免內(nèi)存溢出。

WeakReference 弱引用

弱引用比軟引用更弱,被弱引用關(guān)聯(lián)的對象只能存活到發(fā)生下一次垃圾回收之前,也就是說當(dāng)發(fā)生GC時(shí),無論當(dāng)前內(nèi)存是否足夠,都會被回收掉。

給出demo

代碼很簡短,就是先構(gòu)建一個(gè)弱引用對象,然后在gc前先打印出來證明它存在過,之后手動調(diào)用gc,再次打印,可以看出已經(jīng)沒了。運(yùn)行結(jié)果如下

PhantomReference 虛引用

虛引用和上面不同的地方在于,一個(gè)對象是否有虛引用的存在,完全不會對其生存時(shí)間構(gòu)成如何影響,并且也無法通過虛引用來獲取一個(gè)對象的實(shí)例,也就是說跟沒有引用與之關(guān)聯(lián)一樣,在任何時(shí)候都可能被垃圾回收器回收。

那么這樣就很容易產(chǎn)生疑問了,虛引用的作用又是什么呢?

作用就是能在這個(gè)對象被收集器回收時(shí)收到一個(gè)系統(tǒng)通知,實(shí)現(xiàn)追蹤垃圾收集器的回收動作,比如在對象被回收的時(shí)候,會調(diào)用該對象的finalize方法。

在給出相關(guān)demo前,要先介紹一個(gè)

ReferenceQueue 引用隊(duì)列

ReferenceQueue 引用其實(shí)也可以歸納為引用中的一員,可以和上述三種引用類型組合使用【軟引用、弱引用、虛引用】。

那么它有何作呢?

在創(chuàng)建Reference時(shí),手動將Queue注冊到Reference中,而當(dāng)該Reference所引用的對象被垃圾收集器回收時(shí),JVM會將該Reference放到該隊(duì)列中,而我們便可以對該隊(duì)列做些其他業(yè)務(wù),相當(dāng)于一種通知機(jī)制。

給出demo

可以從demo中看出隊(duì)列的用法,運(yùn)行打印結(jié)果如下

我們可以從結(jié)果中看到先是從引用中g(shù)et出來的對象為null,證明上面說的無法通過虛引用來獲取一個(gè)對象的實(shí)例,并且在回收后會被放入隊(duì)列中。

和Reference相關(guān)的概念

首先為了方便JVM進(jìn)行管理,Reference是有狀態(tài)的,可以分為以下四種狀態(tài)

active 一般來說內(nèi)存一開始被分配的狀態(tài),而當(dāng)被引用的對象的可達(dá)性發(fā)生變化后gc就會將引用放入pending隊(duì)列并將其狀態(tài)改為pending狀態(tài)。

pending 指的是準(zhǔn)備要被放進(jìn)pending隊(duì)列的對象。

enqueue 指的是對象的內(nèi)存已經(jīng)被回收了。

inactive 這是最終的狀態(tài),不能再變?yōu)槠渌鼱顟B(tài)。

JVM怎么知道引用在不在

關(guān)于JVM怎么知道引用在不在,這就涉及到了JVM的可達(dá)性分析算法了
JVM的可達(dá)性分析算法的簡單思路就是通過一系列GC Roots作為出發(fā)點(diǎn),向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對象到GC Roots沒有任何引用鏈,即表明從GC Roots到這個(gè)對象不可達(dá)時(shí),證明此對象不可用,可被回收。如下圖所示

對象4、5、6都是可被回收的。
那么問題來了,哪些對象可以作為GC Roots呢?
這里給出幾個(gè),如下

虛擬機(jī)棧中引用的對象

方法區(qū)中類靜態(tài)屬性引用的對象

方法區(qū)中常量引用的對象

本地方法棧JNI引用的對象

具體的想要深入研究的可以自行百度&谷歌,或者等我后面深入分析。

最后的最后

該篇文章基本解答了【談?wù)剬ava中幾種引用的理解】,如果想要更深入的研究,就要從源碼入手了解了。
下次遇見這種面試題,基本上就不慌了,因?yàn)閷?shí)際上只要認(rèn)真看完該篇文章并且記住幾個(gè)關(guān)鍵的地方,基本上就不會被面試官問倒了,并且該篇文章后面也解答了【JVM怎么知道引用在不在】和【哪些對象可以作為GC Roots】的問題。

公眾號主營:服務(wù)端編程相關(guān)技術(shù)解說,具體可以看歷史文章。

公眾號副業(yè):各種陪聊吹水,包括技術(shù)、就業(yè)、人生經(jīng)歷、大學(xué)生活、內(nèi)推等等。

歡迎關(guān)注,一起侃大山

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77787.html

相關(guān)文章

  • 【好好面試】學(xué)完Aop,動態(tài)代理的原理都不懂?

    摘要:總結(jié)動態(tài)代理的相關(guān)原理已經(jīng)講解完畢,接下來讓我們回答以下幾個(gè)思考題。 【干貨點(diǎn)】 此處是【好好面試】系列文的第12篇文章。文章目標(biāo)主要是通過原理剖析的方式解答Aop動態(tài)代理的面試熱點(diǎn)問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進(jìn)而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認(rèn)代理類型是什么 為什么不用靜態(tài)代理 JDK動態(tài)代理原理 CGLIB動態(tài)代理...

    Keven 評論0 收藏0
  • 一篇文章看懂大數(shù)據(jù)分析就業(yè)前景及職能定位

    摘要:今天就先給大家講大數(shù)據(jù)分析工程師。所以你要和我說你在外面培訓(xùn)了個(gè)月的大數(shù)據(jù)分析后,就想做了,那請你再考慮考慮。而他們鼓吹的大數(shù)據(jù)分析師,其實(shí)就是。 showImg(https://segmentfault.com/img/remote/1460000018722710?w=1000&h=750); Overview: 序 基本概念 DS的職能要求 DE的職能要求 總結(jié) 一、序 今天...

    itvincent 評論0 收藏0
  • 大三Java實(shí)習(xí)總結(jié)網(wǎng)易百度小米美團(tuán)阿里(均拿offer)

    摘要:基礎(chǔ)回答的好百度說實(shí)話沒想到百度會給我打面試電話,畢竟是,在我心中地位還是很高的。后來第二天就通知我說直接過了,不用二三面了,就這樣只面了一面稀里糊涂的過了百度。差不多是這些,因?yàn)槭敲追鬯院敛华q豫的接收了小米,沒去百度。 ----------5月5日確認(rèn)收到阿里offer ----------4月12日昨天阿里HR面完,目前在等結(jié)果的階段,無論結(jié)果如何都能接收,作為一名雙非學(xué)校的本科...

    atinosun 評論0 收藏0
  • 18年求職面經(jīng)及總結(jié)

    摘要:年求職面經(jīng)及總結(jié)我的求職之路差不多走到盡頭了感覺真是精疲力盡了把這大半年的經(jīng)歷和面試總結(jié)寫下來希望能給和我一樣在求職路上煎熬的人一點(diǎn)幫助先說背景微電子科學(xué)與工程專業(yè)學(xué)過兩門和相關(guān)的課程語言和單片機(jī)這個(gè)專業(yè)的唯一好處就是大部分人并不知道這個(gè)專 18年求職面經(jīng)及總結(jié) 我的求職之路差不多走到盡頭了,感覺真是精疲力盡了.把這大半年的經(jīng)歷和面試總結(jié)寫下來,希望能給和我一樣在求職路上煎熬的人一點(diǎn)幫...

    zhangwang 評論0 收藏0
  • 18年求職面經(jīng)及總結(jié)

    摘要:年求職面經(jīng)及總結(jié)我的求職之路差不多走到盡頭了感覺真是精疲力盡了把這大半年的經(jīng)歷和面試總結(jié)寫下來希望能給和我一樣在求職路上煎熬的人一點(diǎn)幫助先說背景微電子科學(xué)與工程專業(yè)學(xué)過兩門和相關(guān)的課程語言和單片機(jī)這個(gè)專業(yè)的唯一好處就是大部分人并不知道這個(gè)專 18年求職面經(jīng)及總結(jié) 我的求職之路差不多走到盡頭了,感覺真是精疲力盡了.把這大半年的經(jīng)歷和面試總結(jié)寫下來,希望能給和我一樣在求職路上煎熬的人一點(diǎn)幫...

    fjcgreat 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<