85W美團架構師分享深入解析Java虛擬機HotSpot文檔 前言 目錄 主要內容 本文適合的讀者對象

前言

Java語言已經走過了20多個年頭,在此期間雖然新語言層出不窮,但是都沒有撼動Java的位置。可能是歷史選擇了Java,也可能是Java改變了歷史,總之,Java無疑是一門成功的編程語言。這門語言之所以能如此成功,高性能語言虛擬機HotSpot功不可沒。

客觀地說,HotSpot VM是目前頂級的語言虛擬機之一,它的模板解釋器是語言解釋器的最終狀態,除非有重大技術突破和方法論的改變,否則很難被超越。它的垃圾回收器也日臻完善,新的無停頓GC的出現標誌着JVM正在邁向GC頂級俱樂部。它的即時編譯器是權衡編譯開銷與應用吞吐量後得到的一個卓越且精湛的藝術品。

本文既考慮到內容的廣度也關注了技術的深度,詳細描述了虛擬機的底層實現,並與上層Java語言或者庫結合,以實用爲目標展開介紹,同時還討論了它們的深刻意義。

從內容廣度的角度看,本文除了討論耳熟能詳的Java虛擬機技術外,還詳細討論了業界最新的通用虛擬機平臺Graal VM、CDS/AppCDS/DynamicCDS、Instrumentation庫、編譯重放、非標準字節碼、棧上替換,RTM鎖、JIT編譯器IR、JIT編譯器可視化工具、編譯逃離、EpsilonGC/ShenandoahGC/ZGC、G1字符串去重等技術。

從內容深度的角度看,本文詳細討論了:

  • G1 GC的回收策略和底層代碼實現;
  • C1編譯器的HIR和LIR,以及針對不同IR上應用的優化;
  • C2編譯器的Ideal Graph以及平臺無關的優化技術;
  • CPU重排序與ObjectMonitor、Mutex的底層實現;
  • 模板解釋器的代碼片段生成邏輯和字節碼模板生成邏輯;

目錄

主要內容

本文共11章,全文從邏輯上可分爲運行時、編譯器、垃圾回收器三個部分。

第一部分(第1~6章),介紹Java虛擬機運行時的相關知識;

第1章Java大觀園;作爲本書的開篇,本章將圍繞Java的生態系統,簡單介紹JDK、JVM、JEP,引導讀者走進虛擬機的世界。

1.1節介紹了各具特色的JDK分支和OpenJDK的子項目。1.2節介紹了Java改進提案,它們代表類Java社區最新的工作動向。1.3節簡單描述了歷史長河中存在或者曾經存在的Java虛擬機。1.4節討論了HotSpotVM的組件、源碼結構、構建、調試以及修改代碼後如何迴歸測試。最後1.5節展望未來,討論了Java的前沿技術Graal VM。

第2章類可用機制;一個類需要經過漫長的旅程才能被虛擬機其他組件,如解釋器、編譯器、GC等在運行時使用,下面將詳細介紹類的一個完整生命週期,即加載、鏈接、初始化三部曲。

本章從2.1節開始,介紹了位於磁盤的二進制表示的字節碼被類文件解析器加載並解析,得到虛擬機內部用於表示類的InstanceKlass數據結構。爲了保證字節碼是安全可靠的,在2.2節鏈接階段,首先驗證了字節碼的結構正確性;出於性能考慮,鏈接階段還可能調用重寫器將一些字節碼替換爲高性能的版本,加快後面的解釋執行;鏈接階段的核心工作是設置編譯器/解釋器入口以便後續代碼能夠正常執行,同時爲了保障後續解釋/編譯模式的切換,還會設置適配器來消除兩種模式之間的溝壑。接着,根據《Java虛擬機規範》中賦予類初始化的語義,在2.3節介紹了初始化階段同時執行用戶的靜態代碼塊和隱式靜態字段初始化。最後2.4節特別討論了類的重定義。

第3章對象和類;本章討論Java對象和類在HotSpot VM內部的具體實現,探索虛擬機在底層是如何對這些Java語言的概念建模的。

本章主要圍繞對象和類的相關內容展開。3.1節介紹了HotSpot VM中對象和類的設計原則。3.2節介紹了對象和類模型,它們在JVM層表示Java層的對象。3.3節介紹了類模型,它們在JVM層表示Java層的Class<?>。對象和類共同構成對象類二分模型,是HotSpot VM的核心數據結構。

第4章運行時;運行時,顧名思義是指虛擬機運行的時候,它表徵程序執行時的狀態,本章將討論虛擬機運行時涉及的方方面面。

4.1節討論了JVM中五花八門的線程以及它們的作用。4.2節從源碼角度分析線程API的實現,同時擴展分析線程API實現時涉及的其他重要模塊如JavaCalls、os,並簡單提及ParkEvent、Parker、OrderAccess組件。4.3節討論了線程棧幀的實現。4.4節討論虛擬機層的代碼如何與Java層的代碼交互,以此引出JNI和JavaCalls模塊。4.5節討論JDK中的Unsafe類,並給出它在虛擬機的具體實現。

第5章模板解釋器;最簡單的Java虛擬機可以只包括類加載器和解釋器:類加載器加載字節碼iconst_1、iconst_1、iadd並傳給虛擬機,解釋器按照字節碼計算並得到結果。在沒有JIT編譯器的情況下,解釋器從某種程度上來說就是虛擬機本體,有關虛擬機的絕大部分問題都能在解釋器中找到答案。本章將詳細討論解釋器的內部構造和解釋執行過程。

本章討論了HotSpot VM中最重要組件之一——解釋器的構成和工作機制。5.1節討論解釋器的源碼結構和構成解釋器的基礎設施;5.2節討論了構成解釋器的元素;5.3節和5.4節描述瞭解釋器與其他虛擬機組件的合作方式;5.5節詳細討論瞭解釋器實現,包括解釋器如何執行普通Java方法和native方法、標準字節碼是如何實現的,以及非標準字節碼是如何實現的。

第6章併發設施;併發是Java的一大特色,通過併發,可以在Java層實現多個線程協同工作或者互斥執行。上層應用的易用性、安全性、高效性都是由HotSpot VM中的併發設施來保證的。併發設施是HotSpot VM中相當複雜的組件,本章將簡單討論虛擬機在併發方面付出的努力。

6.1節介紹了重排序和內存屏障,它們是Java內存模型的基礎。6.2節簡單介紹了Java內存模型,它在程序的一些特定的地方設置內存屏障,禁止指令重排序的發生,使程序順序和執行順序保持一致。6.3節介紹了虛擬機內部併發基礎設施,包括原子操作、ParkEvent、Parker、Monitor,它們廣泛用於虛擬機內部的各種需要同步的地方。6.4節介紹了更高層次的基於併發繼承設施的鎖優化策略。

第二部分(第7~9章),介紹編譯基礎知識和虛擬機的兩個即時編譯器;

第7章編譯概述;編譯器是一個相對複雜且專業的領域,需要一些先驗理論知識。本章將簡單討論編譯理論的基本概念,也會逐一討論HotSpot VM本身涉及的許多特設的編譯技術,爲後面的篇章打下理論基礎。

本章簡單介紹了虛擬機涉及的編譯技術。7.1節介紹了即時編譯器依賴的運行時代碼生成技術,然後分門別類地介紹了HotSpot VM的各類編譯器。7.2節介紹HotSpot VM特設的編譯技術,它們和虛擬機運行時緊密相連。爲了理解後面兩章,7.3節介紹了一些編譯術語的基本概念,讀者如果在後面兩章遇到疑問,可以回顧本節的內容。最後7.4節介紹了編譯器的調試方法和調試工具,便於讀者深入理解即時編譯器的行爲。

第8章C1編譯器;C1使用經典的基於靜態單賦值的兩層圖IR作爲HIR:第一層爲控制流圖,用於處理控制流;第二層爲基本塊,用於處理數據流。C1的HIR同時含有控制流和數據流,是學習編譯原理的良好實例,本章將詳細討論C1編譯器(後面簡稱C1)。

8.1節描述瞭解釋器到C1編譯器的調用棧以及C1編譯的主要流程,即字節碼到HIR,再到LIR,最後生成機器代碼的過程。其中,8.2節描述了字節碼到HIR的實現。8.3節描述了C1中比較複雜的代碼優化過程,基本涵蓋了HIR的所有優化操作。8.4節描述了從HIR到LIR的生成過程,由於LIR到機器代碼大部分是線性映射過程,所以不再贅述。

第9章C2編譯器;C2編譯器即Op to Compiler,又叫Server Compiler,它的定位與C1相反:C1面向客戶端程序,需要快速響應用戶請求;C2面向長期運行的服務端程序,它允許在編譯上花更多時間,以此換取程序峯值執行性能。本章將詳細討論大名鼎鼎的C2編譯器(後面簡稱C2)。

9.1節簡單概括了C2的編譯流程,並簡要介紹了C2的核心數據結構理想圖。9.2節描述了編譯流程的開始,即理想圖的構造過程。9.3節描述了編譯流程的中間優化步驟。最後9.4節簡單介紹了編譯流程的後面部分,也就是核心的代碼生成過程。

第三部分(第10~11章),介紹各種垃圾回收器並深入分析G1GC。

第10章垃圾回收;垃圾回收是JDK開發者社區最活躍的主題,在-XX:+RunReallyFast虛擬機參數沒有到來之前,瞭解垃圾回收運行機制和工作原理對於Java開發者是很有必要的。本章將從最簡單的垃圾回收器開始,逐個介紹垃圾回收器的原理和底層實現。

本章根據歷史時間線介紹了HotSpot VM現存的所有垃圾回收器。10.1節簡單討論虛擬機與垃圾回收器交互的機制。10.2節介紹了SerialGC,它使用單線程清理垃圾。10.3節的Parallel GC解決了Serial GC的不足,使用多線程清理垃圾。10.4節的CMS GC部分解決了Parallel GC的不足,除了多線程清理垃圾外,還允許清理垃圾過程中Mutator線程繼續運行。10.5節的G1GC解決了CMS GC的不足,將堆劃分爲Region,回收過程中整理Region,消除碎片化。10.6節的Shenandoah GC解決了G1 GC的不足,它的回收停頓時間不會隨着堆變大而增長,同時允許對象複製階段Mutator線程繼續工作。10.7和10.8節的ZGC與Shenandoah GC同屬於新一代的低延時垃圾回收器,它們的目標STW時間均小於10ms,且不會隨着堆的增大而變長。最後對所有垃圾回收器做了簡單總結。

第11章G1GC;G1 GC是面向服務端應用程序的垃圾回收器,通過新的堆設計和停頓預測模型,可以到達用戶指定的一個比較合理的軟實時目標。本章將詳細分析G1 GC的設計和實現。

11.1節簡單介紹了G1的基本概念及其垃圾回收策略。11.2節詳細討論了YGC。11.3節重點討論了G1獨有的Mixed GC,具體回收過程可分爲全局併發標記和對象複製過程。其中,全局併發標記選擇收益較高的對象,對象複製借用YGC的代碼將對象複製到新的Region,然後清理原來的Region。11.4節簡單討論了FGC,在YGC或者FGC過程中G1可以可選地執行字符串去重操作。11.5節以YGC爲例介紹了G1字符串去重。

需要這份【深入解析Java虛擬機HotSpot】443頁文檔的小夥伴,,可以轉發此文關注小編!

**需要的朋友麻煩幫忙點贊一下文章,+小助理V X: bjmashibing001  免費領取!**

本文適合的讀者對象

本文適合那些希望在Java語言方面有進一步提升的開發者,也適合任何對JVM底層感興趣且想要一探究竟的開發者。

同時,對編譯器或垃圾回收器感興趣的讀者也能從中受益。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章