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