-
1 # Javaspring架構師
-
2 # AI君
jvm虛擬機器的解釋執行邏輯和嵌入式裝置的c語言執行過程比較像。
這裡我還是先說結論。我們知道,嵌入式裝置的執行過程:
1. c語言編碼除錯開發。
2. IDE將c語言轉義成嵌入式裝置相關的組合語言。
3. 組合語言轉為嵌入式裝置機器碼燒入裝置。
然後嵌入式裝置即可執行我們編寫的相關指令。
類似的,jvm執行過程與這個非常相近。
1. javac編譯原始檔,把java檔案轉為class檔案。class檔案可認為是jvm的組合語言檔案。
2. jvm根據jvm規範中規定的彙編指令集,按指令解析,執行class檔案描述的內容。
當然,這裡可能還包括jvm的垃圾回收,記憶體模型邏輯,jit編譯,class檔案頭的一些鎖邏輯等等。。。。這裡不在展開。大致過程如圖:
java的開發者非常聰明。我們知道,這種解釋執行語言號稱一次編譯到處執行。在早期,計算機語言都是與平臺相關的。各個平臺的編譯器,對應的編譯產物都不相同。
本質上我們是透過不同的編譯,來適應不同的執行環境。為了實現垮平臺執行,也有一些嘗試做跨平臺的編譯器。但是成本高,而且仍然需要編譯3套原始碼。
既然跨系統開發編譯器不明智,那麼,跨系統開發執行環境呢?
顯然這個逆襲思維就成了目前跨平臺執行語言的主要實現思想。這個逆向思維在很多計算機技術上都有體現。
--理解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。
如果你已經按照我上面的建議,學習了上面相關的大部分內容,仍然遭到面試官的拒絕。建議你換個其他崗位,有可能面試官本身太水。
回覆列表
其實,“為什麼學Java虛擬機器”這個問題,就和“為什麼要學習資料結構和演算法”是一個道理:工欲善其事,必先利其器。可以說,Java虛擬機器就是每一位Java工程師進階加薪的利器,你想往上升,你想深入技術,不想一直停留在簡單開發,或者你在做Java效能分析、調優工作時,那麼,Java虛擬機器絕對是一把助力的利劍。面試風氣簡單的問題都不好意思問,怕面試者鄙視面試公司問的問題。現在有一股妖風,不管啥公司都慢慢像阿里這樣的公司靠近,面試不問點jvm、併發、分散式都不好意(雖然公司可能沒有用到,雖然可能僅僅CURD),老是覺得問問這些顯得逼格高點,不管處於什麼原因很多公司的確都在學習他們,都在問這些問題,那麼我們就朝著這些大的方向努力也是沒錯的,如果朝著這些方向努力就是他們需要的人才,那麼也就對了。類似其他,比如高併發 鎖、分散式、快取等都可以考慮考慮這樣思考,你會有不一樣的收穫的。