Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
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)存中的堆,
原因是: 程序計(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)容。