【死磕JVM】JVM快速入門之前戲篇

牧小農發表於2021-02-24

簡介

Java是一門可以跨平臺的語言,但是Java本身是不可以實現跨平臺的,需要JVM實現跨平臺。javac編譯好後的class檔案,在Windows、Linux、Mac等系統上,只要該系統安裝對應的Java虛擬機器,class檔案都可以執行。達到 ”一次編譯,到處執行” 的效果。

什麼是JVM

JVM是可以執行在Java程式碼的虛擬的計算機,既然是虛擬的計算機,當然也包含自己的CPU、位元組碼指令集、暫存器、棧、垃圾回收、堆和儲存方法域,我們可以理解成JVM自己就是一套作業系統。

Java從編譯到執行

Virtual Machine是物理機器的軟體實現。Java是用在VM上執行的WORA(Write Once Run Anywhere)概念而開發的。編譯器將Java檔案編譯為Java .class檔案,然後將.class檔案輸入到JVM中,JVM會載入並執行類檔案,如下圖所示:

在這裡插入圖片描述

1. 編譯

對於Java程式碼來說,是對於一個java類的編譯,利用java編譯器(javac.exe)將原始碼編譯成能夠被JVM的類載入器載入的.class檔案(位元組碼),位元組碼不是機器碼,是一箇中間程式碼,與平臺無關。java編譯一個類的時候,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然後引用,如果java編譯器在指定的目錄下找不到該類所依賴的類的 .class檔案或者 .java原始檔,就會報 "Cant found sysbol"的異常錯誤。

編譯後的位元組碼檔案格式主要分為兩部分:常量池和方法位元組碼。

  • 常量池記錄的是程式碼出現過的(常量、類名、成員變數等)以及符號引用(類引用、方法引用,成員變數引用等);
  • 方法位元組碼中放的是各個方法的位元組碼。

2. 執行

java類執行的過程大概分為兩個步驟:

  1. 類的載入
  2. 類的執行

需要說明的一點的是:JVM主要在程式第一次執行時主動使用類的時候,才會立即去載入。換言之,JVM並不是在執行時就會把所有使用到的類都載入到記憶體中,而是用到,不得不載入的時候,才載入進來,而且只載入一次。

從跨平臺的語言到跨語言的平臺

目前有一百多種語言可以跑在Java虛擬機器上....
在這裡插入圖片描述

1、Java是跨平臺的語言

意思是說程式設計師寫程式碼的時候只需要寫一次程式碼,javac編譯也只編譯一次,但是可以在windows上執行,也可以把打好的包放到linux或者macos上執行。

在這裡插入圖片描述

2、jvm是跨語言的平臺

任何語言只要使用提供的編譯器編譯相應的語言,通過jvm就可以執行了在這裡插入圖片描述

2、jvm與Java無關

任何語言只要你能編譯成class就可以編譯在JVM上

在這裡插入圖片描述

JVM

JVM是一種規範
(1)虛擬機器是一種抽象的計算機,通過從實際的計算機中模擬模擬各種計算機功能來實現的。JAVA虛擬機器規範是一種對JAVA虛擬機器實現的規範要求,是由oracle制定的,而我們平時常說的JAVA虛擬機器一般是指的一種具體的JAVA虛擬機器規範的實現。比如我們最經常使用的JAVA虛擬機器hotspot,其實JAVA虛擬機器還有很多種實現,甚至如果你對JAVA虛擬機器規範有了深入的瞭解而且對此有興趣的話,可以寫一個自己的JAVA虛擬機器,當然這其中的難度不難想象。Java虛擬機器有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。JVM遮蔽了與具體作業系統平臺相關的資訊,使得Java程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。

(2)JVM是Java程式執行的環境,同時是一個作業系統的一個應用程式程式,因此它有自己的生命週期,也有己的程式碼和資料空間。

(3)JVM體系主要是兩個JVM的內部體系結構分為三個子系統和兩大元件,分別是: 類裝載(ClassLoader)子系統、執行引擎子系統和GC子系統 元件是記憶體執行資料區域和本地介面。

常見的JVM實現

一、Hotspot

HotSpot VM,它是Sun JDK和OpenJDK中所帶的虛擬機器,也是目前使用範圍最廣的Java虛擬機器。
但不一定所有人都知道的是,這個目前看起來“血統純正”的虛擬機器在最初並非由Sun公司開發,而是由一家名為“Longview Technologies”的小公司設計的;
甚至這個虛擬機器最初並非是為Java語言而開發的,它來源於Strongtalk VM,
而這款虛擬機器中相當多的技術又是來源於一款支援Self語言實現“達到C語言50%以上的執行效率”的目標而設計的虛擬機器,
Sun公司注意到了這款虛擬機器在JIT編譯上有許多優秀的理念和實際效果,在1997年收購了Longview Technologies公司,從而獲得了HotSpot VM。

HotSpot VM既繼承了Sun之前兩款商用虛擬機器的優點(如前面提到的準確式記憶體管理),也有許多自己新的技術優勢,
如它名稱中的HotSpot指的就是它的熱點程式碼探測技術(其實兩個VM基本上是同時期的獨立產品,HotSpot還稍早一些,HotSpot一開始就是準確式GC,
而Exact VM之中也有與HotSpot幾乎一樣的熱點探測。
為了Exact VM和HotSpot VM哪個成為Sun主要支援的VM產品,在Sun公司內部還有過爭論,HotSpot打敗Exact並不能算技術上的勝利),
HotSpot VM的熱點程式碼探測能力可以通過執行計數器找出最具有編譯價值的程式碼,然後通知JIT編譯器以方法為單位進行編譯。
如果一個方法被頻繁呼叫,或方法中有效迴圈次數很多,將會分別觸發標準編譯和OSR(棧上替換)編譯動作。
通過編譯器與直譯器恰當地協同工作,可以在最優化的程式響應時間與最佳執行效能中取得平衡,而且無須等待原生程式碼輸出才能執行程式,
即時編譯的時間壓力也相對減小,這樣有助於引入更多的程式碼優化技術,輸出質量更高的原生程式碼。

在2006年的JavaOne大會上,Sun公司宣佈最終會把Java開源,並在隨後的一年,陸續將JDK的各個部分(其中當然也包括了HotSpot VM)在GPL協議下公開了原始碼,
並在此基礎上建立了OpenJDK。這樣,HotSpot VM便成為了Sun JDK和OpenJDK兩個實現極度接近的JDK專案的共同虛擬機器。

在2008年和2009年,Oracle公司分別收購了BEA公司和Sun公司,這樣Oracle就同時擁有了兩款優秀的Java虛擬機器:JRockit VM和HotSpot VM。
Oracle公司宣佈在不久的將來(大約應在釋出JDK 8的時候)會完成這兩款虛擬機器的整合工作,使之優勢互補,所以我們現在使用的虛擬機器應該就是整合之後的虛擬機器。
整合的方式大致上是在HotSpot的基礎上,移植JRockit的優秀特性,譬如使用JRockit的垃圾回收器與MissionControl服務,使用HotSpot的JIT編譯器與混合的執行時系統。

檢視JVM,我們只需要使用 java -version就可以檢視了
在這裡插入圖片描述

二、Jrockit

jrockit前身是BA jrockit,後被oracle收購,並免費釋出,但並不開源。

jrockit可以看做是相容標準的JDK基礎上的JVM,同原有的JVM相比,jrockit聲稱在速度上有顯著的提高(甚至超過70%),jrockit在速度上的優勢使其應用在時間敏感的領域內,如軍事,電信,控制等,這也得益於其針對不同處理器架構所做的優化,曾經號稱是世界上最快的JVM

三、J9

J9 是一個IBM推出的Java虛擬機器和類庫,J9在IBM的從移動裝置到企業解決方案中廣泛的被使用

四、Microsoft VM

來自於微軟的JVM

五、TaobaoVM

hotspot深度定製版,除了在效能優化方面下足了功夫,TaobaoVM還在HotSpot的基礎之上大幅度擴充了一些特定的增強實現。比如創新的GCIH(GC invisible heap)技術實現off-heap,這樣一來就可以將生命週期較長的Java物件從heap中移至heap之外,並且GC不能管理GCIH內部的Java物件,這樣做最大的好處就是降低了GC的回收平率以及提升了GC的回收效率,並且GCIH中的物件還能夠在多個Java虛擬機器程式中實現共享。其他擴充技術還有利用PMU hardware的Java profiling tool和診斷協助功能等。

據說淘寶裡面大概有十個人能夠手寫TaobaoVM,都是P9 P10級別的

六、LiquidVM

直接針對於硬體

七、azul zing

最新垃圾回收的業界標杆,效能極高,但是這個是收費的,並且只有土豪才用的起。

官網:www.azul.com

JDK JRE JVM

在這裡插入圖片描述
JVM : 英文名稱(Java Virtual Machine),就是我們耳熟能詳的 Java 虛擬機器。它只認識 xxx.class 這種型別的檔案,它能夠將 class 檔案中的位元組碼指令進行識別並呼叫作業系統向上的 API 完成動作。所以說,jvm 是 Java 能夠跨平臺的核心,具體的下文會詳細說明。

JRE : 英文名稱(Java Runtime Environment),我們叫它:Java 執行時環境。它主要包含兩個部分,jvm 的標準實現和 Java 的一些基本類庫。它相對於 jvm 來說,多出來的是一部分的 Java 類庫。

JDK : 英文名稱(Java Development Kit),Java 開發工具包。jdk 是整個 Java 開發的核心,它整合了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。

顯然,這三者的關係是:一層層的巢狀關係。 JDK>JRE>JVM

為什麼我們的電腦在裝完 jdk 後會有兩個版本的 jre?
在這裡插入圖片描述
沒有聯絡。甚至準確的來說,它倆是一樣的,無論是用哪一個都是可以的。只是很多人習慣將會單獨安裝另一個 jre,雖然單獨安裝的 jre 也並沒有被使用,原因可能就是剛開始大家都不清楚 jdk 和 jre 之間的關係,所以就預設的都安裝上了。

小結

今天的JVM知識點就講完了,有疑問的小夥伴可以留言或評論

怕什麼真理無窮,進一步有進一步的歡喜,我是牧小農,大家加油!!!

相關文章