1. 程式人生 > >Java虛擬機器詳解(一)------簡介

Java虛擬機器詳解(一)------簡介

  本系列部落格我們將以當前預設的主流虛擬機器HotSpot 為例,詳細介紹 Java虛擬機器。以 JDK1.7 為主,同時介紹與 JDK1.8 的不同之處,通過Oracle官網以及各種文獻進行整理,並加以驗證,力求保證這塊知識的正確性,完整性。

  以下是本系列部落格參考的相關文件:

  ①、JDK1.7虛擬機器規範:https://docs.oracle.com/javase/specs/jvms/se7/html/index.html

    JDK1.8虛擬機器規範:https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

  ②、Oracle Java SE 8 產品元件:https://docs.oracle.com/javase/8/docs/index.html

  ③、周志明老師:《深入理解Java虛擬機器:JVM高階特性與最佳實踐》

  ④、陳濤老師:《HotSpot實戰》

1、Oracle Java SE 8 產品元件

  通過上面給定的地址,我們可以看到如下這張圖:

  

  通常來說 Java平臺標準版(Java SE)包括 Java SE開發工具包(JDK)和Java SE執行時環境(JRE)。

  JRE提供了執行以Java程式語言編寫的applet和應用程式所必需的庫,Java虛擬機器和其他元件;JDK包括JRE以及編譯器和偵錯程式等命令列開發工具,可以用來開發Java應用程式 。

  PS:JDK包含JRE,我們通常安裝JDK的同時也會安裝JRE。

2、虛擬機器

  上圖的最下一行Java虛擬機器是被 JRE 所包含,我們在介紹Java虛擬機器時,先了解虛擬機器的概念。

  所謂虛擬機器,其實就是一臺虛擬的機器,可以用來執行一系列虛擬的命令。大體上虛擬機器可以分為兩種:系統虛擬機器和程式虛擬機器。

  ①、系統虛擬機器:是完全對物理計算機的模擬,可以說和一臺真實的PC作業系統沒什麼區別。比如常用的 Vmare 以及 Visual Box 軟體,通過這些軟體能夠模擬出具有完整硬體系統功能的、執行在一個完全隔離環境中的完整計算機系統。

  ②、程式虛擬機器:專門為執行單個計算程式而產生,最典型的就是Java虛擬機器,在Java虛擬機器中執行位元組碼檔案命令。

3、Java虛擬機器

  瞭解了什麼是虛擬機器,我們再看什麼是 Java虛擬機器。

  Java虛擬機器可以看做是一臺抽象的計算機,如同真實的計算機那樣,它有自己的指令集以及各種執行時記憶體區域,它與Java語言沒有必然的聯絡,只與特定的二進位制檔案——class 檔案格式關聯(位元組碼檔案),可以通過Java語言或者其他語言編寫的程式編譯成class檔案,然後在Java虛擬機器上執行。Java虛擬機器有以下二個特點:

  ①、語言無關

  Java虛擬機器只和class檔案關聯,所以只要你編寫程式的語言能夠編譯成class檔案,那麼都能夠在Java虛擬機器上執行。

  

 

  ②、平臺無關

  Java從誕生之初就宣傳的一個口號:一次編寫,到處執行。

  也就是說Java是一個跨平臺的語言,那麼Java是如何實現跨平臺的呢?

  其實Java之所以跨平臺是因為Java虛擬機器的適配,不同的系統實現不同的Java虛擬機器。Java虛擬機器就相當於作業系統和應用程式之間的中介,每種平臺安裝適應該平臺的Java虛擬機器,那麼我們編寫的程式當然能夠在任意平臺執行。

  

4、Java虛擬機種類

  商用虛擬機器:

   ①、Sun HotSpot

  該虛擬機器效能優越,是 sun JDK1.3 及以後所有 sun JDK 版本預設的虛擬機器,使用最為廣泛,本系列部落格就是以這個虛擬機器為平臺進行介紹。

  

  ②、BEA  JRockit

  JRockit 虛擬機器是 BEA 公司於 2002 年從 Appeal Virtual Machines 收購獲得的虛擬機器。它是一款面向伺服器硬體和服務端使用場景高度優化過得虛擬機器,曾經號稱是“世界上速度最快的虛擬機器”。由於專注於服務端應用,它的內部不包含解析器的實現,全部程式碼都靠即時編譯器編譯後執行。

  ③、IBM J9

  J9 虛擬機器是 IBM 公司單獨開發的高效能虛擬機器,它並不獨立出售,而是作為 IBM 公司各種產品的執行平臺,IBM 把它定義為一個可以適應從嵌入式裝置到大型企業級應用的、高可移植性的Java執行平臺。

  ④、Sun Classic 

  這個虛擬機器很原始,是 JDK1.0 時代使用的Java虛擬機器,是各種虛擬機器的鼻祖,它的內部不存在即時編譯器,只能使用純解釋的方式執行。

  ⑤、Sun Exact 

  這是 Sun 公司在 HotSpot 之外的另一個虛擬機器,在 JDK1.2 時代曾短暫的投入過商用,它和 HotSpot 同時開發,但最終被 HotSpot 取代。

  ⑥、Apache Harmony 

  Harmony 是 Apache 軟體基金會主導的、開源的、獨立的、實際相容與 JDK1.5 和 JDK1.6的虛擬機器實現,它間接催生了 Google Android 平臺的 Dalvik 虛擬機器,Android 的影響力現在有多大不用多說,目前已經是最成功的的數碼裝置通用平臺。但是由於它的 TCK 授權問題,直接導致 Apache 與 Oracle 的決裂,從而退出了 JCP 組成,這是近代 Java 陣營遇到的最嚴重的分裂危機。

  嵌入式虛擬機器

  ①、Dalvik

  Dalvik 虛擬機器是 Google 等廠商合作開發的 Android 移動裝置平臺的核心組成部分之一,它執行 dex(Dalvik Executable) 檔案而不是 class 檔案,使用暫存器架構而不是棧架構,但是它的開發體系與Java有著千絲萬縷的關係,可以直接使用大部分的 Java API、dex 檔案可以直接從class檔案轉化而來。並且在 Android 2.2 中提供了即時編譯器的實現,效能大大的提高。

  ②、KVM

  在 Android、IOS 等智慧手機作業系統出現之前,曾廣泛應用於手機平臺的一種虛擬機器。

  ③、CDC/CLDC HotSpot

  CDC和 CLDC HotSpot 分別是 Sun 針對高階嵌入式裝置和中低端嵌入式裝置的虛擬機器,用來代替 KVM。

&n