八股文騷套路之JVM
大家好,這是面試八股文騷套路系列的第四篇,JVM 篇。近幾年Java后端面試中,對 JVM 的考察越來越嚴(yán)格,這也給還沒工作經(jīng)驗的應(yīng)屆生帶來很大的難度。本期我們就給 JVM 知識部分畫一畫重點(diǎn),給大家講講如何應(yīng)付面試官對 JVM 的考察。
推薦閱讀:
我首先要給大家推薦兩本書,一本是準(zhǔn)備后端面試時人手一本的深入理解 Java 虛擬機(jī),另一本是實戰(zhàn) Java 虛擬機(jī)。


推薦理由:深入理解 Java虛擬機(jī) 這本書的推薦理由不用多說,面試官的 JVM 知識也是從這本書上學(xué)的。推薦實戰(zhàn) Java 虛擬機(jī)這本書的理由呢,是因為深入理解 Java 虛擬機(jī)這本書初學(xué)者看起來有點(diǎn)困難。如果你一點(diǎn) JVM 虛擬機(jī)基礎(chǔ)都沒有,那么我建議你先快速過一遍實戰(zhàn) Java 虛擬機(jī),然后再去啃深入理解Java虛擬機(jī)這本書。我的理念一直是先易后難,先做到上手再做到深挖。深入理解 Java 虛擬機(jī)這本書很厚,但是通過我的劃重點(diǎn),能把書變薄。大家先把我劃重點(diǎn)的部分學(xué)會,就完全夠應(yīng)付面試了,剩下的部分有時間再看就好了。
「面試小技巧:」
這里插播一則面試小技巧。在面試過程中,面試官特別注重應(yīng)聘者的歸納和總結(jié)能力。希望大家在回答面試官的問題時,都能把要回答的知識總結(jié)成 1,2,3,4 這樣,然后一條條的給面試官講述出來。比如你有一個秒殺系統(tǒng),你就應(yīng)該這樣給面試官講。我的秒殺系統(tǒng)的架構(gòu)為 Nginx + Redis + RabbitMQ + MySQL。首先我在緩存數(shù)據(jù)庫上采用 Cluster 形式的集群,解決了 xxx 問題。在消息中間件上采用什么方式解決了什么問題,最后在 MySQL 部分我針對 xxx 情況進(jìn)行了 xxx 設(shè)計,解決了 xxx 問題。我見過許多應(yīng)聘者,想起什么說什么,把自己說懵了,也把面試官搞糊了。不管是講項目,還是背八股文,甚至是參加hr面,在聽到問題的時候都應(yīng)該想一下,把回答條理了再給面試官講,這樣面試官能快速的捕捉到你的重點(diǎn)。
深入理解Java虛擬機(jī)
第二部分 自動內(nèi)存管理
「第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常」
第2章屬于第二部分的一個總概括,也是 JVM 八股文面試中的一大考點(diǎn)。首先,運(yùn)行時數(shù)據(jù)區(qū) 是面試官特別愛問的一個問題。
面試官在考察 JVM 部分時,起始問題一般就是運(yùn)行時數(shù)據(jù)區(qū)中包含哪些區(qū)域?哪些區(qū)域時線程共享?哪些區(qū)域線程隔離?然后以此再問你各個部分的細(xì)節(jié)。這幾個區(qū)域中,堆和方法區(qū)又是考察的重點(diǎn)。另外虛擬機(jī)在 Java 堆中 對象的創(chuàng)建 、內(nèi)存布局 、對象訪問 定位這幾個過程也是面試八股文的一大考點(diǎn)。如果有時間的話把 2.4 節(jié) OutOfMemoryError 異常的實例了解一下也是挺好的。
「第3章 垃圾收集器與內(nèi)存分配策略」
垃圾收集器是面試中重點(diǎn)的重點(diǎn)。首先 引用計數(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)知識點(diǎn)要充分理解并且記熟(這是超高頻考點(diǎn)),Serial、ParNew 等了解就好,新生代的垃圾收集器暫時就別看了,你不說面試官不會問的。3.8節(jié)的內(nèi)存分配與回收策略的實戰(zhàn)要好好看下,對象優(yōu)先在 Eden 分配、大對象直接進(jìn)入老年代、長期存活的對象進(jìn)入老年代、動態(tài)對象年齡判定、空間分配擔(dān)保 這些技術(shù)做了什么要記清楚。這些技術(shù)使用的常見參數(shù)有哪些?
「第4章 虛擬機(jī)性能監(jiān)控、故障處理工具」
這一章有時間看下,把幾個常用的工具記一下,沒時間就別看了。當(dāng)時有個面試官問我虛擬機(jī)怎么做性能監(jiān)控,我說我知道有工具可以監(jiān)控虛擬機(jī)性能,但名字我記不清了,面試官說你知道有工具就行。
「第5章 調(diào)優(yōu)案例分析與實戰(zhàn)」
在這一章可以學(xué)一兩個實例套到自己項目中給面試官講,但是如果你感覺自己給面試官講不清楚,那么千萬別勉強(qiáng)。你別說你有 JVM 調(diào)優(yōu)經(jīng)驗,面試官一般也不會問你。
第三部分 虛擬機(jī)執(zhí)行子系統(tǒng)
「第6章 類文件結(jié)構(gòu)」
大致掃讀一遍就可以了,了解就行,面試官基本不問。
「第七章 虛擬機(jī)類加載機(jī)制」
類的生命周期 一定要記牢,就是下面這張圖。

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

下面我出一些問題,把我上面說的學(xué)完以后,你可以用來自測一下你 JVM 準(zhǔn)備的怎么樣了,可以收藏了等面試前再過一遍。答案都在深入理解Java虛擬機(jī)這本書中。
「測試開始」
1.運(yùn)行時數(shù)據(jù)區(qū)中包含哪些區(qū)域?哪些線程共享?哪些線程獨(dú)享?
2.講一下 Java 創(chuàng)建一個對象的過程。
3.如何訪問對象?
4.你了解分代理論嗎?講一下 Minor GC、還有 Full GC
5.Java 用什么方法確定哪些對象該被清理?講一下可達(dá)性分析算法的流程。
6.JDK 中有幾種引用類型?分別的特點(diǎn)是什么?
7.如何回收方法區(qū)?
8.標(biāo)記清楚、標(biāo)記復(fù)制、標(biāo)記整理分別是怎樣清理垃圾的?各有什么優(yōu)缺點(diǎn)?
9.JVM 中的安全點(diǎn)和安全區(qū)各代表什么?寫屏障你了解嗎?
10.講一下解決并發(fā)掃描時對象消失問題的兩種方案。
11.對于 JVM 的垃圾收集器你有什么了解的?你講一下。
有時候面試官會問出這種十分開放性的問題,你需要腦子里過一下你對這個大問題下的哪些知識熟悉哪些不熟悉,不熟悉的點(diǎn)一下就過,熟悉的展開講。在準(zhǔn)備校招時,我的一個是阿里 P7 的學(xué)姐,給我做過一次模擬面試,問出這個問題時讓我有點(diǎn)懵,那么多東西我不知道從哪開始回答呀,就答得很凌亂。模擬面試完我問她這種問題應(yīng)該從哪開始回答?她說她因為不知道我的掌握情況,所以就先問一個大問題,根據(jù)我的回答再追問,以后遇到這種問題主要從自己熟悉得方面切入就可以了。后來的面試還真遇到過好幾次這種情況,我就答,垃圾收集器的種類有以下幾種 Serial,ParNew...現(xiàn)在用的多的還是 CMS 和 G1,CMS 的垃圾收集流程是 xxx,G1的垃圾收集流程是 xxx,他們特點(diǎn)是...就這樣把話題引到 CMS 和 G1了,只 CMS 和 G1 這部分和面試官討論十幾分鐘完全沒問題。
12.新生代垃圾收集器有哪些?老年代垃圾收集器有哪些?哪些是單線程垃圾收集器,哪些是多線程垃圾收集器?各有什么特點(diǎn)?各基于哪一種垃圾收集算法?
13.講一下 CMS 垃圾收集器的四個步驟。CMS 有什么缺點(diǎn)?
14.G1垃圾收集器的步驟。有什么缺點(diǎn)?
15.講一下內(nèi)存分配策略?
16.虛擬機(jī)基礎(chǔ)故障處理工具有哪些?
17.類的生命周期?類加載階段完成了哪些事情。
18.講一下雙親委派模型。
19.把你對 volatile 的了解講一下。
20.Java 內(nèi)存模型的原子性、可見性和有序性是通過哪些操作實現(xiàn)的?
21.線程的狀態(tài)有哪些?
22.按照線程安全的強(qiáng)度來區(qū)分,分為哪幾類?
23.線程安全的實現(xiàn)方法有哪些?
24.鎖優(yōu)化技術(shù)你了解什么?
上述問題都是面試互聯(lián)網(wǎng)大廠后端崗位時的常問問題,我希望你都能熟練的答出來呀!暫時沒記牢也不用太擔(dān)心,我建議你在投簡歷和約面時,把最想去的公司的面試稍微往后推一推,先面幾家自己拿不到 offer 也不會難過的公司。上面這些八股文就是通過我 平時+面試 記熟的,去年 7月 初第一次我面一家中小廠,這些都磕磕絆絆的答不出來,但是到后期 8月底 9月初完全能輕松應(yīng)對各大廠面試官了。
大家在校招過程中遇到問題歡迎來找我聊天呀。
我是 Guide哥,一個工作2年有余,接觸編程已經(jīng)6年有余的程序員。大三開源 JavaGuide,目前已經(jīng) 100k+ Star。未來幾年,希望持續(xù)完善 JavaGuide,爭取能夠幫助更多學(xué)習(xí) Java 的小伙伴!共勉!凎!點(diǎn)擊即可了解我的個人經(jīng)歷。
歡迎點(diǎn)贊分享。咱們下期再會!
