Java核心面試寶典】Day12、“Java虛擬機(jī)”相關(guān)面試題大總結(jié)

      網(wǎng)友投稿 768 2022-05-29

      Hello,你好呀,我是灰小猿!一個(gè)超會(huì)寫bug的程序猿!

      用堅(jiān)持締造技術(shù)、用指尖敲動(dòng)未來!

      和很多小伙伴們一樣,我也是一名奔波在Java道路上的“創(chuàng)造者”。也想靠技術(shù)來改未來,改變世界!因?yàn)槲覀儓?jiān)信每一次敲動(dòng)鍵盤都能讓生活變得更智能、世界變得更有趣!

      在此專欄《Java核心面試寶典》記錄我們備戰(zhàn)夢想的【day 12】!

      叮叮叮!我又來了。今天給大家?guī)淼氖顷P(guān)于Java虛擬機(jī)相關(guān)的面試題。這部分面試題的理論性有些強(qiáng),不容易理解,但是偏偏還是很多面試官愛出的內(nèi)容,沒辦法,難搞喔~~~

      Java虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把他管理的的內(nèi)存劃分成若干個(gè)不同的數(shù)據(jù)區(qū)域,這些區(qū)域有不同的用途。下面就來看一下在這一部分會(huì)有哪些常見的面試題呢?

      1、在Java虛擬機(jī)中哪一塊內(nèi)存區(qū)域不會(huì)出現(xiàn)OutOfMemoryError(內(nèi)存不足錯(cuò)誤)的錯(cuò)誤?

      程序計(jì)數(shù)器是唯一不會(huì)出現(xiàn)OutOfMemoryError的內(nèi)存區(qū)域。

      2、虛擬機(jī)棧描述的是什么?存放什么內(nèi)容/

      虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型,當(dāng)一個(gè)方法被執(zhí)行時(shí)會(huì)創(chuàng)建棧幀存入棧內(nèi),棧幀用于存儲(chǔ)局部變量表,操作棧,動(dòng)態(tài)鏈接,方法出口等信息。

      3、虛擬機(jī)棧可能出現(xiàn)哪兩種異常,分別會(huì)在什么情況下出現(xiàn)?

      虛擬機(jī)??赡艹霈F(xiàn)的兩種異常是StackOverflowError(堆棧溢出異常)和OutMemoryError(內(nèi)存不足異常)

      如果虛擬機(jī)棧不可以動(dòng)態(tài)擴(kuò)展, 當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度時(shí),將拋出 StackOverflowError 異常;

      如果虛擬機(jī)??梢詣?dòng)態(tài)擴(kuò)展, 當(dāng)無法申請到足夠的內(nèi)存時(shí),將拋出 OutOfMemoryError 異常。

      4、堆的特點(diǎn)是什么?存放什么內(nèi)容?

      堆是Java虛擬機(jī)管理的內(nèi)存中最大的一塊,其目的是存放對象實(shí)例,幾乎所有的對象都在堆中分配內(nèi)存。

      5、靜態(tài)變量存放在哪一塊內(nèi)存區(qū)域?

      靜態(tài)變量存放在方法區(qū),

      和 Java 堆一樣,方法區(qū)也是被所有線程共享的內(nèi)存區(qū)域。方法區(qū)用于存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

      但是自JDK 1.8以后, 將方法區(qū)徹底移除,取而代之的是元空間,元空間使用的是直接內(nèi)存。

      6、垃圾回收主要針對Java內(nèi)存中的哪一個(gè)區(qū)域?

      垃圾回收主要針對Java內(nèi)存中的堆,

      【Java核心面試寶典】Day12、“Java虛擬機(jī)”相關(guān)面試題大總結(jié)

      原因是: 程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧都是線程私有的,當(dāng)線程結(jié)束時(shí),這些區(qū)域的生命周期也結(jié)束了,因此不需要過多考慮回收的問題。而堆是虛擬機(jī)管理的內(nèi)存中最大的一塊,堆中的內(nèi)存的分配和回收是動(dòng)態(tài)的,垃圾回收主要關(guān)注的是堆空間。

      7、方法System.gc的作用是什么?該方法與Runtime類中的方法gc有什么區(qū)別和聯(lián)系?

      方法System.gc 的作用是提示 Java 虛擬機(jī)進(jìn)行垃圾回收,該方法被調(diào)用之后,由 Java 虛擬機(jī)決定是立即回收還是延遲回收。在 System 類中,方法 gc 是靜態(tài)方法,在 Runtime 類中,方法 gc 是實(shí)例方法,方法System.gc 會(huì)調(diào)用Runtime類中的 gc 方法,System.gc等價(jià)于 Runtime.getRuntime.gc。

      8、方法finalize在哪個(gè)類中定義,以及它的默認(rèn)實(shí)現(xiàn)是什么?該方法的作用是什么?

      方法 finalize在 Object 類中被定義,該方法的默認(rèn)實(shí)現(xiàn)不做任何事。在釋放對象占用的內(nèi)存之前會(huì)調(diào)用該方法,如果必要,子類應(yīng)該重寫該方法,一般建議在該方法中釋放對象持有的資源。

      9、判斷對象是否可以回收。有哪兩種算法?

      判斷對象是否可以回收的兩種算法是“引用計(jì)數(shù)算法”和“根搜索算法”。

      10、追問:那么Java使用的是哪一種算法,另一種算法又有什么不足之處呢?

      Java使用的是“根搜索算法”,“引用計(jì)數(shù)算法”雖然實(shí)現(xiàn)簡單,判定效率高,但是缺點(diǎn)是無法解決對象之間循環(huán)引用的問題,當(dāng)存在循環(huán)引用時(shí),使用引用計(jì)數(shù)算法會(huì)導(dǎo)致無法對循環(huán)引用的對象進(jìn)行回收。

      引用計(jì)數(shù)算法

      引用計(jì)數(shù)算法給每個(gè)對象添加引用計(jì)數(shù)器,用于記錄對象被引用的計(jì)數(shù),引用計(jì)數(shù)為 0 的對象即為可回收的對象。

      雖然引用計(jì)數(shù)算法的實(shí)現(xiàn)簡單,判定效率也很高,但是引用計(jì)數(shù)算法無法解決對象之間循環(huán)引用的情況。如果多個(gè)對象之間存在循環(huán)引用,則這些對象的引用計(jì)數(shù)永遠(yuǎn)不為 0,無法被回收。因此 Java 語言沒有使用引用計(jì)數(shù)算法。

      根搜索算法

      主流的商用程序語言都是使用根搜索算法判斷對象是否可回收。根搜索算法的思路是,從若干被稱為 GC Roots 的對象開始進(jìn)行搜索,不能到達(dá)的對象即為可回收的對象。

      在 Java 中,GC Roots 一般包含下面幾種對象:

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

      本地方法棧中的本地方法引用的對象;

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

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

      11、Java中的四種引用按照引用強(qiáng)度從高到低的順序依次是什么?

      強(qiáng)引用、軟引用、弱引用、虛引用

      強(qiáng)引用是指在程序代碼中普遍存在的引用。垃圾回收器永遠(yuǎn)不會(huì)回收被強(qiáng)引用關(guān)聯(lián)的對象。

      軟引用描述還有用但并非必需的對象。只有在系統(tǒng)將要發(fā)生內(nèi)存溢出異常時(shí),被軟引用關(guān)聯(lián)的對象才會(huì)被回收。在 JDK 1.2 之后,提供了 SoftReference 類實(shí)現(xiàn)軟引用。

      弱引用描述非必需的對象,其強(qiáng)度低于軟引用。被弱引用關(guān)聯(lián)的對象只能存活到下一次垃圾回收發(fā)生之前,當(dāng)垃圾回收器工作時(shí),被弱引用關(guān)聯(lián)的對象一定會(huì)被回收。在 JDK 1.2 之后,提供了 WeakReference 類實(shí)現(xiàn)弱引用。

      虛引用是最弱的引用關(guān)系。一個(gè)對象是否有虛引用的存在,完全不會(huì)對其生存時(shí)間構(gòu)成影響,也無法通過虛引用取得一個(gè)對象實(shí)例。為一個(gè)對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個(gè)對象被回收時(shí)收到一個(gè)系統(tǒng)通知。在 JDK 1.2 之后,提供了 PhantomReference 類實(shí)現(xiàn)虛引用。

      12.新生代和老年代分別適合使用哪種垃圾回收算法?

      在新生代中,大多數(shù)對象的生命周期都很短,因此適合采用復(fù)制算法;

      在老生代中,對象存活率高,因此選用標(biāo)記-清除算法或標(biāo)記-整理算法。

      13、在分配內(nèi)存空間時(shí),為什么大對象直接在老年代中分配?

      將大對象直接在老年代中分配的目的是避免在Eden區(qū)和 Survivor區(qū)之間出現(xiàn)大量內(nèi)存復(fù)制。

      今日總結(jié)

      今天和大家分享的有關(guān)于Java虛擬機(jī)的相關(guān)內(nèi)容,但是這一部分內(nèi)容的理論性特別強(qiáng),不容易記憶,因此這一部分在面試前看看能記住就行了,但是里面的垃圾回收的幾個(gè)算法還是要了解的。如“引用計(jì)數(shù)算法”、“根搜索算法”、“標(biāo)記-清除算法”、“復(fù)制算法”、“標(biāo)記-整理算法”、“分代收集算法”等。

      如果小伙伴們有遇到其他相關(guān)的面試題,歡迎在評(píng)論區(qū)留言提出,我會(huì)把大家提出的總結(jié)到文章內(nèi)`, 歡迎小伙伴們一起評(píng)論區(qū)打卡學(xué)習(xí)!小伙伴們可也在左方加我好友一起探討學(xué)習(xí)!

      我是==灰小猿==,我們下期見!

      Java 虛擬化

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:一文搞清二進(jìn)制補(bǔ)碼 丨【奔跑吧!JAVA】
      下一篇:Java基礎(chǔ) 第二節(jié) 第七課
      相關(guān)文章
      亚洲黄色免费在线观看| 久久亚洲精品无码播放| 日本亚洲成高清一区二区三区 | 亚洲蜜芽在线精品一区| 亚洲成AV人片在线观看ww| 亚洲自偷自偷图片| 在线a亚洲v天堂网2019无码| 国产精品亚洲高清一区二区| 亚洲乱码中文字幕手机在线| 国产成人亚洲精品无码AV大片| 亚洲精品天堂成人片AV在线播放| 亚洲色欲啪啪久久WWW综合网| 亚洲午夜福利在线视频| 亚洲国产欧美日韩精品一区二区三区| 亚洲精品国产精品| 国产亚洲综合一区二区三区| 亚洲乱码国产一区网址| 爱情岛论坛网亚洲品质自拍| 国产国拍亚洲精品福利| 亚洲无线观看国产精品| 亚洲AV无码成人精品区天堂| 亚洲国产综合专区在线电影| 久久亚洲精品人成综合网| 亚洲精品国产情侣av在线| 激情综合亚洲色婷婷五月| 香蕉大伊亚洲人在线观看| 亚洲日本VA午夜在线电影| 狼人大香伊蕉国产WWW亚洲| 丁香亚洲综合五月天婷婷| 亚洲无码精品浪潮| 亚洲国产精品SSS在线观看AV| 亚洲av丰满熟妇在线播放| 亚洲视频中文字幕在线| 67194在线午夜亚洲| 亚洲精华国产精华精华液| 亚洲国产精品成人一区| 亚洲国产美女精品久久久久∴| 亚洲午夜未满十八勿入| 亚洲人成在线免费观看| 亚洲国产av玩弄放荡人妇| 久久久久亚洲AV成人网人人网站|