在當前Java行業激烈競爭的形式下,唯有掌握技術,心中才不能慌。在多年前,我就開始苦練底層技術,但是眼看百遍也不如手過一遍,所以我打算把虛擬機器器的精華實現部分用手敲出來,這個過程註定不會輕鬆,但是心態不能著急,要一步一步來,一年二年三年後終能達成。
這個過程還會錄製一些免費視訊,簡單介紹一下這個視訊適合的目標人群,達到的目的等。
對虛擬機器器底層實現有濃厚興趣的人
想提升Java技術,精通Java語言的人
想切入虛擬機器器和編譯器領域研發的人
想通過大型複雜的專案提升C++水平的人
不過HotSpot VM專案太過複雜,對C++、Linux系統程式設計、組合指令、機器指令、編譯原理等各方面都有較高的要求,如果這些方面的基礎比較弱的話,還需要多加強。
精通Java的底層實現
對虛擬機器器的效能調優和故障排查得心應手
能夠對虛擬機器器整體的實現有一個清晰的認識,達到動手開發虛擬機器器的能力
對後續研究更為複雜的C2編譯器和G1等垃圾收集器有非常大的幫助
熟練使用C++
熟練掌握組合語言
當研究lua、python等虛擬機器器時會感到更簡單,研究v8等時感覺程式碼許多都很熟悉,很類似
另外,開課也會讓許多人堅持下來,畢竟有人引路,也能節省非常多的時間和精力
Linux(Ubuntu 16.04)
CPU架構為X86,位數為64
版本僅支援JDK1.8(也就是向前相容的程式碼全部省略)
Linux核心版本 4.4.0-210-generic
GNU 5.4.0版本的編譯器
編輯器:Visual Studio Code1 .51.0
使用語言:主體為C++語言,少量組合有C語言
商用HotSpot VM手寫內容時,由於整個工程的程式碼在50萬行左右,其中95%以上都是C++。我們只實現其實的精華部分即可,所以許多功能都不會實現。
不實現的功能如下:
(1)只實現C1編譯器,不實現C2編譯器
(2)沒有指標壓縮版實現
(3)堆不支援大頁
(4)位元組碼直譯器不再手寫實現(PC上的效率太低,不適合生產用,但是會詳細介紹)
(5)只包含Serial/Serial Old收集器,後期會實現G1,不實現Parallel和CMS等收集器
(6)不對類載入過程中的類進行合法性驗證,也就是沒有驗證階段
(7)不實現偏向鎖和輕量級鎖,直接使用重量級鎖,會詳細介紹偏向鎖和輕量級鎖
(8)執行緒採用NPTL 2.23版本,不相容LinuxThreads
(9)不對一些統計做實現,如寫PerfData, NMT等功能,記錄GC紀錄檔等
(10)不實現SharedCDS
(11)省略SecurityManager和Protected Domain,型別安全檢查約束
(12)不實現偵錯資訊記錄
(13)FlatProfiler不實現
(14)不實現一些實驗性質的邏輯
(15)可省略的一些驗證邏輯,如驗證AdapterBlob的正確性,加上-XX:-VerifyAdapterCalls命令省略
(16)不對一些支援Java層Deprecated方法的功能進行實現,如執行緒的suspend和resume
(17)對預設選項為false的邏輯不實現,如UseNUMA等
(18)JNI和JVMTI選擇性實現
(19)不實現vmStructs,不支援 SA(Serviceability Agent)
(20)不實現JMX、Attach及內部一些命令,如dumpheap、threaddump、jcmd及load等
當然,後續還有非常多需要補充和完善的地方,請持續關注...
大模組的實現路徑如下:
內部鎖
執行緒
二分模型
類的載入和解析
堆的簡單規劃
後設資料區
CodeCache
模板直譯器解釋執行
Serial和Serial Old垃圾收集器
C1編譯器
由於各個模組都是耦合緊密,相互交錯,所以具體編寫時會是一個循序漸進,逐步完善的過程。不會是一個模組寫完再另外一個模組,需要以基本面完善點這樣一個過程。
在B站上免費更新一部分視訊,後續有收費開課的打算。免費課程大綱如下:
手寫Java虛擬機器器HotSpot終於要錄製一系列視訊啦!
有對虛擬機器器、Java效能故障診斷與調優等感興趣的人可以入群討論。