八股文騷套路之JVM(重構(gòu)完善版)

近幾年 Java 后端面試中,對(duì) JVM 的考察越來越嚴(yán)格,這也給還沒工作經(jīng)驗(yàn)的應(yīng)屆生帶來很大的難度。本期我們就給 JVM 知識(shí)部分畫一畫重點(diǎn),給大家講講如何應(yīng)付面試官對(duì) JVM 的考察。
1救急準(zhǔn)備
下面這些問題都是面試互聯(lián)網(wǎng)大廠后端崗位時(shí)的常問問題,我希望你都能熟練的答出來呀!暫時(shí)沒記牢也不用太擔(dān)心,我建議你在投簡(jiǎn)歷和約面時(shí),把最想去的公司的面試稍微往后推一推,先面幾家自己拿不到 offer 也不會(huì)難過的公司。上面這些八股文就是通過我 平時(shí)+面試 記熟的,去年 7 月 初第一次我面一家中小廠,這些都磕磕絆絆的答不出來,但是到后期 8 月底 9 月初完全能輕松應(yīng)對(duì)各大廠面試官了。
另外,我通過打星與加粗的方式對(duì)下面面試題的重要性進(jìn)行評(píng)級(jí)!難度是針對(duì)互聯(lián)網(wǎng)大廠的。
? :面試中不常問到,如果面試官問到盡量能答出來,答不出來也沒關(guān)系。 ?? :面試中不常問到,但是如果面試官問到的話,答不出來對(duì)你的印象會(huì)減分。 ???:面試中會(huì)問到,答不出來面試有點(diǎn)懸。面試官會(huì)驚訝為什么你這也不會(huì)。 ????:面試高頻考點(diǎn)。 ?????:面試超高頻考點(diǎn)。四星考點(diǎn)和五星考點(diǎn)是參加十場(chǎng)面試,至少能有五場(chǎng)面試問到這些的。大家在準(zhǔn)備面試過程中盡量把這些知識(shí)點(diǎn)的回答條理梳理清楚,面試官一問就開背。
JVM 基礎(chǔ)常見面試題匯總?:
運(yùn)行時(shí)數(shù)據(jù)區(qū)中包含哪些區(qū)域?哪些線程共享?哪些線程獨(dú)享?【?????】 說一下方法區(qū)和永久代的關(guān)系。【???】 講一下 Java 創(chuàng)建一個(gè)對(duì)象的過程。【????】 對(duì)象的訪問定位的兩種方式(句柄和直接指針兩種方式)。【?????】 你了解分代理論嗎?講一下 Minor GC、還有 Full GC。【?????】 Java 用什么方法確定哪些對(duì)象該被清理?講一下可達(dá)性分析算法的流程。【????】 JDK 中有幾種引用類型?分別的特點(diǎn)是什么?【??】 如何回收方法區(qū)?【???】 標(biāo)記清楚、標(biāo)記復(fù)制、標(biāo)記整理分別是怎樣清理垃圾的?各有什么優(yōu)缺點(diǎn)?【?????】 JVM 中的安全點(diǎn)和安全區(qū)各代表什么?寫屏障你了解嗎?【????】 并發(fā)標(biāo)記要解決什么問題?并發(fā)標(biāo)記帶來了什么問題?如何解決并發(fā)掃描時(shí)對(duì)象消失問題?【????】相關(guān)閱讀:面試官:你說你熟悉 jvm?那你講一下并發(fā)的可達(dá)性分析?。 對(duì)于 JVM 的垃圾收集器你有什么了解的?【????】有時(shí)候面試官會(huì)問出這種十分開放性的問題,你需要腦子里過一下你對(duì)這個(gè)大問題下的哪些知識(shí)熟悉哪些不熟悉,不熟悉的點(diǎn)一下就過,熟悉的展開講。在準(zhǔn)備校招時(shí),我的一個(gè)是阿里 P7 的學(xué)姐,給我做過一次模擬面試,問出這個(gè)問題時(shí)讓我有點(diǎn)懵,那么多東西我不知道從哪開始回答呀,就答得很凌亂。模擬面試完我問她這種問題應(yīng)該從哪開始回答?她說她因?yàn)椴恢牢业恼莆涨闆r,所以就先問一個(gè)大問題,根據(jù)我的回答再追問,以后遇到這種問題主要從自己熟悉得方面切入就可以了。后來的面試還真遇到過好幾次這種情況,我就答,垃圾收集器的種類有以下幾種 Serial,ParNew...現(xiàn)在用的多的還是 CMS 和 G1,CMS 的垃圾收集流程是 xxx,G1 的垃圾收集流程是 xxx,他們特點(diǎn)是...就這樣把話題引到 CMS 和 G1 了,只 CMS 和 G1 這部分和面試官討論十幾分鐘完全沒問題。 新生代垃圾收集器有哪些?老年代垃圾收集器有哪些?哪些是單線程垃圾收集器,哪些是多線程垃圾收集器?各有什么特點(diǎn)?各基于哪一種垃圾收集算法?【????】 講一下 CMS 垃圾收集器的四個(gè)步驟。CMS 有什么缺點(diǎn)?【????】 G1 垃圾收集器的步驟。有什么缺點(diǎn)?【????】 講一下內(nèi)存分配策略?【????】 虛擬機(jī)基礎(chǔ)故障處理工具有哪些?【???】 什么是字節(jié)碼?類文件結(jié)構(gòu)的組成了解嗎?【????】 類的生命周期?類加載的過程了解么?加載這一步主要做了什么事情?初始化階段中哪幾種情況必須對(duì)類初始化?【?????】 講一下雙親委派模型。【?????】
由于篇幅問題,我并沒有寫上面這些問題的答案。你可以自行查閱,你也可以參考 JavaGuide 這個(gè)開源項(xiàng)目,涵蓋了大部分 Java 程序員所需要掌握的核心知識(shí)。背面試八股文,這是一個(gè)必看的開源項(xiàng)目(學(xué) Java 基礎(chǔ)以及實(shí)戰(zhàn)也推薦看這個(gè)項(xiàng)目)。
Github 地址:https://github.com/Snailclimb/JavaGuide Gitee 地址:https://gitee.com/SnailClimb/JavaGuide(Github 無法訪問或者訪問速度比較慢的小伙伴可以看碼云上的對(duì)應(yīng)內(nèi)容) 在線閱讀地址: https://javaguide.cn/

2系統(tǒng)學(xué)習(xí)
如果想要看書學(xué)習(xí) JVM 和準(zhǔn)備 JVM 面試的話,我建推薦兩本書:一本是準(zhǔn)備后端面試時(shí)人手一本的《深入理解 Java 虛擬機(jī)》,另一本是《實(shí)戰(zhàn) Java 虛擬機(jī)》。


《深入理解 Java 虛擬機(jī)》 這本書的推薦理由不用多說,面試官的 JVM 知識(shí)也是從這本書上學(xué)的。推薦實(shí)戰(zhàn) Java 虛擬機(jī)這本書的理由呢,是因?yàn)樯钊肜斫?Java 虛擬機(jī)這本書初學(xué)者看起來有點(diǎn)困難。如果你一點(diǎn) JVM 虛擬機(jī)基礎(chǔ)都沒有,那么我建議你先快速過一遍實(shí)戰(zhàn) Java 虛擬機(jī),然后再去啃深入理解 Java 虛擬機(jī)這本書。我的理念一直是先易后難,先做到上手再做到深挖。深入理解 Java 虛擬機(jī)這本書很厚,但是通過我的劃重點(diǎn),能把書變薄。大家先把我劃重點(diǎn)的部分學(xué)會(huì),就完全夠應(yīng)付面試了,剩下的部分有時(shí)間再看就好了。
這里我們以 《深入理解 Java 虛擬機(jī)》 這本書為例來介紹如何準(zhǔn)備 JVM 面試八股文。
第 2 章 Java 內(nèi)存區(qū)域與內(nèi)存溢出異常
第 2 章屬于第二部分的一個(gè)總概括,也是 JVM 八股文面試中的一大考點(diǎn)。首先,運(yùn)行時(shí)數(shù)據(jù)區(qū)?是面試官特別愛問的一個(gè)問題。下面這張圖大家一定要記牢。

面試官在考察 JVM 部分時(shí),起始問題一般就是運(yùn)行時(shí)數(shù)據(jù)區(qū)中包含哪些區(qū)域?哪些區(qū)域時(shí)線程共享?哪些區(qū)域線程隔離?然后以此再問你各個(gè)部分的細(xì)節(jié)。這幾個(gè)區(qū)域中,堆和方法區(qū)又是考察的重點(diǎn)。另外虛擬機(jī)在 Java 堆中?對(duì)象的創(chuàng)建?、內(nèi)存布局?、對(duì)象訪問?定位這幾個(gè)過程也是面試八股文的一大考點(diǎn)。如果有時(shí)間的話把 2.4 節(jié) OutOfMemoryError 異常的實(shí)例了解一下也是挺好的。
第 3 章 垃圾收集器與內(nèi)存分配策略
垃圾收集器是面試中重點(diǎn)的重點(diǎn)。首先?引用計(jì)數(shù)法?和?可達(dá)性分析算法?必須充分理解,然后強(qiáng)引用?、軟引用?、?弱引用?、虛引用?四種類型必須理解并且記牢,面試官特別愛問四種引用的區(qū)別。垃圾收集算法中的分代收集理論要充分理解并且記熟,標(biāo)記-清楚算法?、標(biāo)記復(fù)制算法?、標(biāo)記整理算法?要充分理解并且記熟,并比較各自的優(yōu)缺點(diǎn)。根節(jié)點(diǎn)枚舉?、安全點(diǎn)?、安全區(qū)域?、記憶集與卡表?、寫屏障?、并發(fā)的可達(dá)性分析?要充分理解并能大致復(fù)述出來。經(jīng)典垃圾收集器?CMS?和?G1?相關(guān)知識(shí)點(diǎn)要充分理解并且記熟(這是超高頻考點(diǎn)),Serial、ParNew?等了解就好,新生代的垃圾收集器暫時(shí)就別看了,你不說面試官不會(huì)問的。3.8 節(jié)的內(nèi)存分配與回收策略的實(shí)戰(zhàn)要好好看下,對(duì)象優(yōu)先在?Eden?分配、大對(duì)象直接進(jìn)入老年代、長(zhǎng)期存活的對(duì)象進(jìn)入老年代、動(dòng)態(tài)對(duì)象年齡判定、空間分配擔(dān)保?這些技術(shù)做了什么要記清楚。這些技術(shù)使用的常見參數(shù)有哪些?
第 4 章 虛擬機(jī)性能監(jiān)控、故障處理工具
這一章有時(shí)間看下,把幾個(gè)常用的工具記一下,沒時(shí)間就別看了。當(dāng)時(shí)有個(gè)面試官問我虛擬機(jī)怎么做性能監(jiān)控,我說我知道有工具可以監(jiān)控虛擬機(jī)性能,但名字我記不清了,面試官說你知道有工具就行。
第 5 章 調(diào)優(yōu)案例分析與實(shí)戰(zhàn)
在這一章可以學(xué)一兩個(gè)實(shí)例套到自己項(xiàng)目中給面試官講,但是如果你感覺自己給面試官講不清楚,那么千萬別勉強(qiáng)。你別說你有 JVM 調(diào)優(yōu)經(jīng)驗(yàn),面試官一般也不會(huì)問你。
第 6 章 類文件結(jié)構(gòu)
大致掃讀一遍就可以了,了解就行,面試官基本不問。
第七章 虛擬機(jī)類加載機(jī)制
類的生命周期?一定要記牢,就是下面這張圖。

上述環(huán)節(jié)的順序要記清楚,每個(gè)環(huán)節(jié)做了什么也要記清楚。比如?加載?階段做了三件事:
(1)通過類的全限定名獲取定義此類的二進(jìn)制字節(jié)流。
(2)將字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。
(3)在內(nèi)存中生成一個(gè)代表這個(gè)類的 Class 對(duì)象作為方法區(qū)這個(gè)類的各種數(shù)據(jù)訪問入口。其它幾個(gè)環(huán)節(jié)同樣,不需要記清楚細(xì)節(jié),但是做了什么要記清楚。
類加載器中的?雙親委派模型?是八股文考試中重點(diǎn)的重點(diǎn),被問到的頻率特別高,一定要充分理解,并且記熟。
說到類加載,Java創(chuàng)建對(duì)象?的過程也一定要記熟呀,類加載檢查 -> 分配內(nèi)存 -> 初始化零值 -> 設(shè)置對(duì)象頭 ->執(zhí)行 init 方法,這個(gè)順序一定要記牢,細(xì)節(jié)也要記清。
第八章 虛擬機(jī)字節(jié)碼執(zhí)行引擎
這一章把?棧幀的結(jié)構(gòu)?弄清楚就差不多了,其它的就掃一眼就好了。
第九章 類加載及執(zhí)行子系統(tǒng)的案例與實(shí)戰(zhàn)
了解一下就可以了,不了解也沒事。
第十二章 Java 內(nèi)存模型與線程
這一章也是八股文面試考察中的重點(diǎn)、Java內(nèi)存模型的定義、內(nèi)存間交互操作?要記清楚。volatile?這個(gè)關(guān)鍵字是面試考察的重點(diǎn),他的作用要徹徹底底的掌握,面試中經(jīng)常問。Java 內(nèi)存模型的三大特征?原子性、可見性和有序性?也一定要理解。Java 線程的狀態(tài)轉(zhuǎn)換?也是一個(gè)常考問題。協(xié)程了解一下就好了。
第十三章 線程安全與鎖優(yōu)化
這部分絕對(duì)是面試中考察的重點(diǎn)中的重點(diǎn)。首先你需要理解并記牢線程安全的幾種實(shí)現(xiàn)方法,比如互斥同步、非阻塞同步?等。互斥同步中有兩個(gè)重要的同步手段一定要重視,一個(gè)是?synchronized,另一個(gè)是?ReentrantLock?。非阻塞同步中一個(gè)重要手段?CAS?一定要充分理解。
鎖優(yōu)化也是考察的重點(diǎn),適應(yīng)性自旋、鎖消除、鎖碰撞、輕量級(jí)鎖、偏向鎖?這些技術(shù)一定要充分理解和記熟。
好了,如果只是為了通過 JVM 的八股文面試的話,把上面我劃重點(diǎn)的內(nèi)容掌握應(yīng)付校招足夠了。這樣看,深入理解 Java 虛擬機(jī)這本書是不是變薄了很多了?但是如果有時(shí)間的話,我還是建議你能夠把整本書都好好看下呀。嗯...我知道你們應(yīng)該學(xué)累了。

