最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

知乎高贊:有什么好的Java內(nèi)存結(jié)構(gòu)面試題

2023-08-17 21:37 作者:Java3y  | 我要投稿

面試官今天來(lái)聊聊JVM的內(nèi)存結(jié)構(gòu)吧?

候選者:嗯,好的

候選者:前幾次面試的時(shí)候也提到了:class文件會(huì)被類加載器裝載至JVM中,并且JVM會(huì)負(fù)責(zé)程序「運(yùn)行時(shí)」的「內(nèi)存管理」

候選者:而JVM的內(nèi)存結(jié)構(gòu),往往指的就是JVM定義的「運(yùn)行時(shí)數(shù)據(jù)區(qū)域」

候選者:簡(jiǎn)單來(lái)說(shuō)就分為了5大塊:方法區(qū)、堆、程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧

候選者:要值得注意的是:這是JVM「規(guī)范」的分區(qū)概念,到具體的實(shí)現(xiàn)落地,不同的廠商實(shí)現(xiàn)可能是有所區(qū)別的。


面試官嗯,順便講下你這圖上每個(gè)區(qū)域的內(nèi)容吧。

候選者:好的,那我就先從「程序計(jì)數(shù)器」開始講起吧。

候選者:Java是多線程的語(yǔ)言,我們知道假設(shè)線程數(shù)大于CPU數(shù),就很有可能有「線程切換」現(xiàn)象,切換意味著「中斷」和「恢復(fù)」,那自然就需要有一塊區(qū)域來(lái)保存「當(dāng)前線程的執(zhí)行信息」

候選者:所以,程序計(jì)數(shù)器就是用于記錄各個(gè)線程執(zhí)行的字節(jié)碼的地址(分支、循環(huán)、跳轉(zhuǎn)、異常、線程恢復(fù)等都依賴于計(jì)數(shù)器)

面試官:好的,理解了。

候選者:那接下來(lái)我就說(shuō)下「虛擬機(jī)?!拱?/p>

候選者:每個(gè)線程在創(chuàng)建的時(shí)候都會(huì)創(chuàng)建一個(gè)「虛擬機(jī)棧」,每次方法調(diào)用都會(huì)創(chuàng)建一個(gè)「棧幀」。每個(gè)「棧幀」會(huì)包含幾塊內(nèi)容:局部變量表、操作數(shù)棧、動(dòng)態(tài)連接和返回地址


候選者:了解了「虛擬機(jī)?!沟慕M成后,也不難猜出它的作用了:它保存方法了局部變量、部分變量的計(jì)算并參與了方法的調(diào)用和返回。

面試官:ok,了解了

候選者:下面就說(shuō)下「本地方法?!拱?/p>

候選者:本地方法棧跟虛擬機(jī)棧的功能類似,虛擬機(jī)棧用于管理 Java 函數(shù)的調(diào)用,而本地方法棧則用于管理本地方法的調(diào)用。這里的「本地方法」指的是「非Java方法」,一般本地方法是使用C語(yǔ)言實(shí)現(xiàn)的。

面試官:嗯…

候選者:嗯,說(shuō)完了「本地方法?!?、「虛擬機(jī)棧」和「程序計(jì)數(shù)器」,哦,下面還有「方法區(qū)」和「堆」

候選者:那我先說(shuō)「方法區(qū)」吧

候選者:前面提到了運(yùn)行時(shí)數(shù)據(jù)區(qū)這個(gè)「分區(qū)」是JVM的「規(guī)范」,具體的落地實(shí)現(xiàn),不同的虛擬機(jī)廠商可能是不一樣的

候選者:所以「方法區(qū)」也只是 JVM 中規(guī)范的一部分而已。

候選者:在HotSpot虛擬機(jī),就會(huì)常常提到「永久代」這個(gè)詞。HotSpot虛擬機(jī)在「JDK8前」用「永久代」實(shí)現(xiàn)了「方法區(qū)」,而很多其他廠商的虛擬機(jī)其實(shí)是沒(méi)有「永久代」的概念的。


候選者:我們下面的內(nèi)容就都用HotSpot虛擬機(jī)來(lái)說(shuō)明好了。

候選者:在JDK8中,已經(jīng)用「元空間」來(lái)替代了「永久代」作為「方法區(qū)」的實(shí)現(xiàn)了

面試官:嗯…

候選者:方法區(qū)主要是用來(lái)存放已被虛擬機(jī)加載的「類相關(guān)信息」:包括類信息、常量池

候選者:類信息又包括了類的版本、字段、方法、接口和父類等信息。

候選者:常量池又可以分「靜態(tài)常量池」和「運(yùn)行時(shí)常量池」

候選者:靜態(tài)常量池主要存儲(chǔ)的是「字面量」以及「符號(hào)引用」等信息,靜態(tài)常量池也包括了我們說(shuō)的「字符串常量池」。

候選者:「運(yùn)行時(shí)常量池」存儲(chǔ)的是「類加載」時(shí)生成的「直接引用」等信息。


面試官:嗯…

候選者:又值得注意的是:從「邏輯分區(qū)」的角度而言「常量池」是屬于「方法區(qū)」的

候選者:但自從在「JDK7」以后,就已經(jīng)把「運(yùn)行時(shí)常量池」和「靜態(tài)常量池」轉(zhuǎn)移到了「堆」內(nèi)存中進(jìn)行存儲(chǔ)(對(duì)于「物理分區(qū)」來(lái)說(shuō)「運(yùn)行時(shí)常量池」和「靜態(tài)常量池』就屬于堆)

面試官:嗯,這信息量有點(diǎn)多

面試官我想問(wèn)下,你說(shuō)從「JDK8」已經(jīng)把「方法區(qū)」的實(shí)現(xiàn)從「永久代」變成「元空間」,有什么區(qū)別?

候選者:最主要的區(qū)別就是:「元空間」存儲(chǔ)不在虛擬機(jī)中,而是使用本地內(nèi)存,JVM 不會(huì)再出現(xiàn)方法區(qū)的內(nèi)存溢出,以往「永久代」經(jīng)常因?yàn)閮?nèi)存不夠用導(dǎo)致跑出OOM異常。

候選者:按JDK8版本,總結(jié)起來(lái)其實(shí)就相當(dāng)于:「類信息」是存儲(chǔ)在「元空間」的(也有人把「類信息」這塊叫做「類信息常量池」,主要是叫法不同,意思到位就好)

候選者:而「常量池」用JDK7開始,從「物理存儲(chǔ)」角度上就在「堆中」,這是沒(méi)有變化的。


面試官:嗯,我聽懂了

面試官最后來(lái)講講「堆」這塊區(qū)域吧

候選者:嗯,「堆」是線程共享的區(qū)域,幾乎類的實(shí)例和數(shù)組分配的內(nèi)存都來(lái)自于它

候選者:「堆」被劃分為「新生代」和「老年代」,「新生代」又被進(jìn)一步劃分為 Eden 和 Survivor 區(qū),最后 Survivor 由 From Survivor 和 To Survivor 組成

候選者:不多BB,我也畫圖吧


候選者:將「堆內(nèi)存」分開了幾塊區(qū)域,主要跟「內(nèi)存回收」有關(guān)(垃圾回收機(jī)制)

面試官:那垃圾回收這塊等下次吧,這個(gè)延伸下去又很多東西了

面試官你要不先講講JVM內(nèi)存結(jié)構(gòu)和Java內(nèi)存模型有啥區(qū)別吧?

候選者:他們倆沒(méi)有啥直接關(guān)聯(lián),其實(shí)兩次面試過(guò)后,應(yīng)該你就有感覺了

候選者:Java內(nèi)存模型是跟「并發(fā)」相關(guān)的,它是為了屏蔽底層細(xì)節(jié)而提出的規(guī)范,希望在上層(Java層面上)在操作內(nèi)存時(shí)在不同的平臺(tái)上也有相同的效果

候選者:Java內(nèi)存結(jié)構(gòu)(又稱為運(yùn)行時(shí)數(shù)據(jù)區(qū)域),它描述著當(dāng)我們的class文件加載至虛擬機(jī)后,各個(gè)分區(qū)的「邏輯結(jié)構(gòu)」是如何的,每個(gè)分區(qū)承擔(dān)著什么作用。

面試官:了解了

今日總結(jié):JVM內(nèi)存結(jié)構(gòu)組成(JVM內(nèi)存結(jié)構(gòu)又稱為「運(yùn)行時(shí)數(shù)據(jù)區(qū)域」。主要有五部分組成:虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器、方法區(qū)和堆。其中方法區(qū)和堆是線程共享的。虛擬機(jī)棧、本地方法棧以及程序計(jì)數(shù)器是線程隔離的)

對(duì)線面試官PDF版本,可+V: java3yyy 免費(fèi)領(lǐng)取



知乎高贊:有什么好的Java內(nèi)存結(jié)構(gòu)面試題的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
卓资县| 颍上县| 拉萨市| 怀远县| 广水市| 达拉特旗| 聊城市| 曲阜市| 工布江达县| 鄱阳县| 安义县| 扬中市| 崇仁县| 灵寿县| 广宁县| 高要市| 梅州市| 青冈县| 江永县| 通州区| 乌鲁木齐县| 兴业县| 曲靖市| 神农架林区| 绩溪县| 双峰县| 宜昌市| 小金县| 安阳县| 达尔| 开化县| 屏东市| 沙坪坝区| 准格尔旗| 张家川| 香格里拉县| 喀什市| 尉犁县| 隆安县| 山丹县| 林口县|