1. 程式人生 > 其它 >6.30學習日記

6.30學習日記

一、JVM簡介

JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言編譯程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。 ——維基百科

Java虛擬機發展到了今天,已經脫離Java語言,形成了一套相對獨立的、高效能的執行方案。除了Java外,Scala、Clojure、Groovy,以及時下熱門的Kotlin,這些語言都可以執行在Java虛擬機器之上。

1.1 JDK於JVM的關係

JDK(包含Java語言、工具及工具API、Java SE API、JVM)是用於支援Java程式開發的最小環境,JRE(包含JavaSE API、JVM)是支援Java程式執行的標準環境。JDK預設內建JVM是HotSpot VM。我們平時所提及的高效能JVM除了HotSpot VM,還包括BEA JRockit VM和IBM J9 VM,這類在通用平臺上執行的商用虛擬機器。

  • 終端檢視Java預設的虛擬機器命令 java -version

1.2 補充知識

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

Oracle準備將Java虛擬機器JRockit和HotSpot整合英文原文:https://www.infoq.com/news/2010/02/jrockit_hotspot/


二、Java虛擬機器家族

2.1 Sun Classic/Exact VM:早期JDK使用的虛擬機器JDK1.0

Java語言首次擁有了商用的正式執行環境,這個JDK中所帶的虛擬機器就是Classic VM。這款虛擬機器只能使用純直譯器方式來執行Java程式碼,如果要使用即時編譯器那就必須進行外掛,但是假如外掛了即時編譯器的話,即時編譯器就會完全接管虛擬機器執行系統,直譯器便不能再工作了。這個階段的虛擬機器雖然用了即時編譯器輸出原生代碼,其執行效率也和傳統的C/C++程式有很大差距,“Java語言很慢”的印象就是在這階段開始在使用者心中樹立起來的。

在JDK 1.2時,曾在Solaris平臺上釋出過一款名為Exact VM的虛擬機器,它的編譯執行系統已經具備現代高效能虛擬機器雛形,如熱點探測、兩級即時編譯器、編譯器與直譯器混合工作模式等。在商業應用上只存在了很短暫的時間就被外部引進的HotSpot VM所取代,甚至還沒有來得及釋出Windows和Linux平臺下的商用版本。

2.2 HotSpot VM:JDK中預設的虛擬機器

它是Sun/OracleJDK和OpenJDK中的預設Java虛擬機器,也是目前使用範圍最廣的Java虛擬機器。但不一定所有人都知道的是,這個在今天看起來“血統純正”的虛擬機器在最初並非由Sun公司所開發,而是由一家名為“Longview Technologies”的小公司設計。Sun收購了Longview Technologies公司,從而獲得了HotSpot虛擬機器。
HotSpot虛擬機器的一大功能就是熱點程式碼探測能力(即時編譯)在2006年的JavaOne大會上,Sun公司宣佈最終會把Java開源,並在隨後的一年,陸續將JDK的各個部分(其中當然也包括了HotSpot VM)在GPL協議下公開了原始碼, 並在此基礎上建立了OpenJDK。這樣,HotSpot VM便成為了Sun JDK和OpenJDK兩個實現極度接近的JDK專案的共同虛擬機器。

2.3 Mobile/Embedded VM:

主要是運用在移動和嵌入式市場的Java虛擬機器產品 但是Java ME中的Java虛擬機器現在處於比較尷尬的位置,所面臨的局面遠不如伺服器和桌面領域樂觀,它最大的一塊市場——智慧手機已被Android和iOS二分天下,但是在曾經的功能機,上面仍然用著Java ME的KVM。

2.4 BEA JRockit/IBM J9 VM:

前面三節介紹的都是由Sun/Oracle公司研發的Java虛擬機器,歷史上除了Sun/Oracle公司以外,也有其他組織、公司開發過虛擬機器的實現。BEA System公司的JRockit與IBM公司的IBM J9。

JRockit的特點是速度快 BEA將其發展為一款專門為伺服器硬體和服務端應用場景高度優化的虛擬機器,由於專注於服務端應用,它可以不太關注於程式啟動速度,因此JRockit內部不包含直譯器實現,全部程式碼都靠即時編譯器編譯後執行。但後面被Oracle公司收購 現已不再繼續發展,永遠停留在R28版本,這是JDK 6版JRockit的代號。

J9虛擬機器的職責分離與模組化做得比HotSpot更優秀,從2016年起,IBM逐步將OMR專案和J9虛擬機器進行開源,完全開源後便將它們捐獻給了Eclipse基金會管理,並重新命名為Eclipse OMR和OpenJ9。

除BEA和IBM公司外,其他一些大公司也號稱有自己的專屬JDK和虛擬機器,但是它們要麼是通過從Sun/Oracle公司購買版權的方式獲得的(如HP、SAP等),要麼是基於OpenJDK專案改進而來的(如阿里巴巴、Twitter等),都並非自己獨立開發。

2.5 其它JVM

除了上面舉例的虛擬機器、還有許多其它的虛擬機器。這裡就不一一列出了。


三、為什麼Java要在虛擬機器裡執行

  1. 由於語言的特性 Java是一門高階語言 語法相對複雜 無法像C語言直接編譯成機器碼 所以Java在執行前需要對其進行一番轉換 也就先轉化成位元組碼檔案當前的主流思路是這樣子的,設計一個面向 Java 語言特性的虛擬機器,並通過編譯器將 Java 程式轉換成該虛擬機器所能識別的指令序列,也稱 Java 位元組碼。
  2. JVM可以輕鬆實現Java程式碼的跨平臺執行 虛擬機器被可以被安裝在各種平臺上(Mac OS Windows_x64 Linux_aarch64) 一個Java被編譯成位元組碼檔案(.class) 就可以在不同平臺上的虛擬機器實現裡執行。這也就是我們經常說的“一次編寫,到處執行”。
  3. JVM提供了一個託管平臺(Managed Runtime)。提供記憶體管理、垃圾回收、編譯時動態校驗(諸如陣列越界、動態型別)等功能。讓我們可以更關心業務的開發 而其它與業務無關的事情由JVM完成 其中最廣為人知的當屬自動記憶體管理與垃圾回收,這部分內容甚至催生了一波垃圾回收調優的業務。

參考資料:

-《深入理解Java虛擬機器:JVM高階特性與最佳實踐》(第3版)周志明 著
-《極客時間 深入拆解Java虛擬機器》 鄭雨迪 著