手寫商用Java虛擬機器器HotSpot,瘋狂磨礪技術中

2023-10-18 12:01:55

在當前Java行業激烈競爭的形式下,唯有掌握技術,心中才不能慌。在多年前,我就開始苦練底層技術,但是眼看百遍也不如手過一遍,所以我打算把虛擬機器器的精華實現部分用手敲出來,這個過程註定不會輕鬆,但是心態不能著急,要一步一步來,一年二年三年後終能達成。

這個過程還會錄製一些免費視訊,簡單介紹一下這個視訊適合的目標人群,達到的目的等。

1、目標人群

對虛擬機器器底層實現有濃厚興趣的人

想提升Java技術,精通Java語言的人

想切入虛擬機器器和編譯器領域研發的人

想通過大型複雜的專案提升C++水平的人

不過HotSpot VM專案太過複雜,對C++、Linux系統程式設計、組合指令、機器指令、編譯原理等各方面都有較高的要求,如果這些方面的基礎比較弱的話,還需要多加強。

2、達到的目的

精通Java的底層實現

對虛擬機器器的效能調優和故障排查得心應手

能夠對虛擬機器器整體的實現有一個清晰的認識,達到動手開發虛擬機器器的能力

對後續研究更為複雜的C2編譯器和G1等垃圾收集器有非常大的幫助

熟練使用C++

熟練掌握組合語言

當研究lua、python等虛擬機器器時會感到更簡單,研究v8等時感覺程式碼許多都很熟悉,很類似

另外,開課也會讓許多人堅持下來,畢竟有人引路,也能節省非常多的時間和精力

3、編譯偵錯環境

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語言

4、功能說明

商用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等

當然,後續還有非常多需要補充和完善的地方,請持續關注...

5、實現路徑:

大模組的實現路徑如下:

內部鎖

執行緒

二分模型

類的載入和解析

堆的簡單規劃

後設資料區

CodeCache

模板直譯器解釋執行

Serial和Serial Old垃圾收集器

C1編譯器

由於各個模組都是耦合緊密,相互交錯,所以具體編寫時會是一個循序漸進,逐步完善的過程。不會是一個模組寫完再另外一個模組,需要以基本面完善點這樣一個過程。

6、後續計劃

在B站上免費更新一部分視訊,後續有收費開課的打算。免費課程大綱如下:

手寫Java虛擬機器器HotSpot終於要錄製一系列視訊啦!

有對虛擬機器器、Java效能故障診斷與調優等感興趣的人可以入群討論。