提到JVM虛擬機(jī)該如何運(yùn)作?
jvm虛擬機(jī)的解釋執(zhí)行邏輯和嵌入式設(shè)備的c語言執(zhí)行過程比較像。
這里我還是先說結(jié)論。我們知道,嵌入式設(shè)備的執(zhí)行過程:
1. c語言編碼調(diào)試開發(fā)。
2. IDE將c語言轉(zhuǎn)義成嵌入式設(shè)備相關(guān)的匯編語言。
3. 匯編語言轉(zhuǎn)為嵌入式設(shè)備機(jī)器碼燒入設(shè)備。
然后嵌入式設(shè)備即可執(zhí)行我們編寫的相關(guān)指令。
類似的,jvm執(zhí)行過程與這個(gè)非常相近。
1. javac編譯源文件,把java文件轉(zhuǎn)為class文件。class文件可認(rèn)為是jvm的匯編語言文件。
2. jvm根據(jù)jvm規(guī)范中規(guī)定的匯編指令集,按指令解析,執(zhí)行class文件描述的內(nèi)容。
當(dāng)然,這里可能還包括jvm的垃圾回收,內(nèi)存模型邏輯,jit編譯,class文件頭的一些鎖邏輯等等。。。。這里不在展開。大致過程如圖:
java的開發(fā)者非常聰明。我們知道,這種解釋執(zhí)行語言號稱一次編譯到處運(yùn)行。在早期,計(jì)算機(jī)語言都是與平臺相關(guān)的。各個(gè)平臺的編譯器,對應(yīng)的編譯產(chǎn)物都不相同。
本質(zhì)上我們是通過不同的編譯,來適應(yīng)不同的執(zhí)行環(huán)境。為了實(shí)現(xiàn)垮平臺執(zhí)行,也有一些嘗試做跨平臺的編譯器。但是成本高,而且仍然需要編譯3套源碼。
既然跨系統(tǒng)開發(fā)編譯器不明智,那么,跨系統(tǒng)開發(fā)執(zhí)行環(huán)境呢?
顯然這個(gè)逆襲思維就成了目前跨平臺執(zhí)行語言的主要實(shí)現(xiàn)思想。這個(gè)逆向思維在很多計(jì)算機(jī)技術(shù)上都有體現(xiàn)。
之前我回答過關(guān)于如何學(xué)java的問題。這里貼出回答中jvm相關(guān)的那部分。可以點(diǎn)擊我的回答,去查看完整內(nèi)容。
--理解jdk,jre即jvm原理和實(shí)現(xiàn)。
這里我推薦看下葛老師的《實(shí)戰(zhàn)java虛擬機(jī)》,里面講解比較偏實(shí)操。容易上手理解。
首先,可以從jdk自帶的工具學(xué)習(xí)來入手。
比如:jstat,jmap,jstack,jps,jdb.......甚至還有直接可以窺視運(yùn)行期間實(shí)際內(nèi)存數(shù)據(jù)的HSDB。當(dāng)然,作為學(xué)習(xí)初步,我們只需要理解常用的幾個(gè)命令,并知道其代表的意義即可。畢竟,第三方監(jiān)控工具,包括jdk本身也提供了3個(gè)可視化的監(jiān)控。
其次,理解jvm的運(yùn)行加載原理,搞懂class文件結(jié)構(gòu)。
這個(gè)過程我們可以借助之前會(huì)用的監(jiān)控工具,理解jvm加載的基本原理。可以參考官方各個(gè)版本的jvm標(biāo)準(zhǔn),學(xué)習(xí)看懂class文件。在此基礎(chǔ)上可以使用如classpy等工具,方便我們直接閱讀class文件。也可以試試支持class字節(jié)碼級別的單步調(diào)試工具。甚至,可以嘗試用用jvm匯編編碼工具。
接下來,理解jvm的垃圾回收機(jī)制發(fā)展歷史和各個(gè)主流垃圾回收器的工作原理。
這個(gè)過程其實(shí)非常復(fù)雜。垃圾回收器有各種串行,并行,新聲代/swap和老年代,以及回收警戒線,full觸發(fā)條件,各種個(gè)樣的基本參數(shù)和不怎么用的超參數(shù),以及G1的H區(qū),ZGC等等。。。還好的是,GC并不屬于jvm官方規(guī)范的一部分。
然后,動(dòng)手做一些jvm的實(shí)踐和實(shí)戰(zhàn),
比如,jvm常見的故障排查和故障總結(jié),性能調(diào)優(yōu),熱加載,class字節(jié)碼的動(dòng)態(tài)操作,asm等。
最后,可以嘗試實(shí)現(xiàn)自己的jvm。(當(dāng)然這個(gè)步驟,對很多同學(xué)來說不是必須了)
這里我推薦幾本書,也是徹底搞懂jvm規(guī)范的學(xué)習(xí)路徑。最好自己實(shí)現(xiàn)垃圾回收器。
周老師的《深入理解Java虛擬機(jī)》。
接下來是《深入嵌入式j(luò)ava虛擬機(jī)》和配套源碼。這個(gè)cldc的jvm源碼只有1M多。目前在oracle的官網(wǎng)上,仍然可以下載。是一個(gè)設(shè)計(jì)非常精簡的jvm實(shí)現(xiàn)。
接下來,可以去閱讀《自己動(dòng)手寫java 虛擬機(jī)》。這本書的jvm實(shí)現(xiàn)是采用go語言編寫。當(dāng)然其中也有很多設(shè)計(jì)并不是非常合理。但基本都遵循了jvm規(guī)范。
這個(gè)時(shí)候就可以去看看github上各種jvm的開源實(shí)現(xiàn)了。有g(shù)o,scalajvm,javainjava,ajvm,python-jvm,lua,各個(gè)版本各個(gè)不同的jvm實(shí)現(xiàn)。
當(dāng)然,這些實(shí)現(xiàn)都只是基本原理。
后面推薦你去看《實(shí)戰(zhàn)hotspot》豹子書,關(guān)注高級語言虛擬機(jī)的圈子。
當(dāng)然,垃圾回收的書籍比較少,這里還是推薦給你垃圾回收的經(jīng)典書《The Garbage Collection Cookbook》。實(shí)際上對新的垃圾回收算法有興趣,可以去知乎搜索相關(guān)的論文和GC算法開源實(shí)現(xiàn)的demo。
如果你已經(jīng)按照我上面的建議,學(xué)習(xí)了上面相關(guān)的大部分內(nèi)容,仍然遭到面試官的拒絕。建議你換個(gè)其他崗位,有可能面試官本身太水。