1. 程式人生 > >JVM、JRE與JDK的關係

JVM、JRE與JDK的關係

最開始學 Java 的時候不是很在意這些比較基礎的東西,只是知道怎麼使用。現在學得有些日子了,雖然也不是很清楚底層的具體實現,但是對於整個體系的搭建大致有了一些瞭解。最近由於找到工作了比較鬆懈,而且也在考駕照,所以有些日子沒學習了。今天一時想起,把之前的筆記整理了一下,順便加深下自己的印象。

下面我就按 JVM、JRE、JDK 順序分別進行說明。

JVM(Java Virtual Machine),即Java虛擬機器

JVM 是 JRE 的一部分,它相當於一個在真實的計算機上模擬出來的虛擬計算機。JVM 擁有完善的硬體架構,如處理器、堆、棧、暫存器等。

Java 是平臺無關的語言,它就是通過 JVM 實現了不同平臺上的執行。要想在不同的作業系統上執行Java程式,就需要在不同作業系統上安裝對應的 JVM。所以,JVM有Windows版本、MAC版本、Linux版本之分。

以 Windows 平臺為例,執行一個 Java 程式,首先需要將 Java 原始碼編譯成 .class 檔案,也就是位元組碼的形式。然後直譯器按照 JVM 在 Windows 系統上的實現規則將位元組碼解釋(或者說翻譯)成 Windows 平臺上的機器碼,然後再交由 Windows 作業系統進行執行。

JRE(Java Runtime Environment),即 Java 執行時環境

JRE 包括了 JVM、執行 Java 程式所需的核心類庫和相關的支援檔案,所有 Java 程式都要在 JRE 這個環境下才能執行。

普通使用者由於多數並不熟悉計算機程式,所以他們需要的是傻瓜式的操作,安裝上就能用。單獨的 JRE 預設安裝在 C:\Program Files\Java\jre1.8.0_66 路徑,安裝時會將版本資訊寫入登錄檔,同時也會建立 C:\ProgramData\Oracle\Java\javapath 路徑,並在此路徑生成 java.exe、javaw.exe、javaws.exe 這幾個工具的快捷方式,並在系統環境變數 Path 的最前面加上 C:\ProgramData\Oracle\Java\javapath;,這也就意味著使用者安裝完 JRE 時一切都已經配置到位,然後他們就可以直接執行 Java 程式了。

如果使用者想安裝多套 JRE,那麼會怎麼樣呢?

使用者在安裝第一套 JRE 的時候會自動建立 javapath 目錄並向環境變數 Path 中寫入該路徑,而安裝第二套、第三套的時候並不會重複寫入環境變數,個人理解是第一次安裝的 JRE 具有優先權,後面安裝 JRE 時並不會修改環境變數,只是將版本資訊寫入了登錄檔,以便系統查詢 JRE 使用,並且會將第一次安裝的 JRE 中的 java.exe、javaw.exe、javaws.exe 拷貝到 C:\Windows\System32。

那麼系統又是怎麼決定使用哪套 JRE 的呢?

首先,使用者執行程式時系統會在環境變數 Path 中依次查詢路徑中是否包含  java.exe、javaw.exe、javaws.exe 這三個可執行檔案,將第一個匹配的路徑作為它們的執行目錄。

然後,查詢 JRE 所在的路徑:

1、在前邊匹配到的目錄所在的路徑進行查詢,若沒有找到則

2、前往其上一級目錄進行查詢,若依舊沒找到則

3、前往登錄檔 HKEY_LOCAL_MACHINE\Software\Javasoft\Java Runtime Environemt 表項下檢視 CurrentVersion 對應的 JRE 版本,然後通過對應 JRE 的版本找到對應的JRE 目錄。若這一步也失敗則只能很遺憾地宣佈,程式無法執行。

倘若前面一切順利,接下來就能成功執行 Java 程式了。

JDK(Java Development Kit),即Java開發套件

安裝 JDK 時會提供三個功能選項。 

“開發工具”這個選項是為開發人員準備的,會提供編譯、除錯以及執行等工具,另外還有一個專用的 JRE,位於JDK 安裝目錄下 jre 子目錄;


“原始碼”這一選項則是安裝包含 Java 的公共 API 的類的原始碼;


“公共 JRE” 如同前面所說,是面向使用者的。


通過上面的圖片可以看到,預設安裝 JDK 時會在機器上安裝兩套 JRE。位於 C:\Program Files\Java\jdk1.8.0_66\jre 那一套面向開發人員,而位於 C:\Program Files\Java\jre1.8.0_66 那一套則面向普通使用者(只提供了執行 Java 程式的環境,不包括其開發環境)。

JDK 安裝目錄下的 bin 子目錄中是 SUN 公司提供的一些工具,如 javac.exe、jar.exe,而這些工具幾乎都是用 Java 語言寫的,比如 javac.exe 所用到的工具就放置在 \lib\tools.jar 裡面,這可以通過下面這個例子進行驗證:

先將 tools.jar 重新命名為 tool.jar,然後執行 javac 命令,這時候會出現如下提示:

錯誤: 找不到或無法載入主類 com.sun.tools.javac.Main

這句話我們可以理解為輸入 javac 與 輸入 java -cp C:\Program Files\Java\jre1.8.0_66\lib\tools.jar com.sun.tools.javac.Main 是等價的,可見 javac 只是一個包裝器,它存在的目的應該只是為了減少開發者輸入命令的長度,避免輸入錯誤提高開發效率。

鑑於上面的原因,執行這些工具也就需要一個執行時環境——即 JRE,JDK 安裝目錄下的 jre 子資料夾就提供了這樣一個專用的執行時環境來確保 JDK 安裝目錄下 bin 子目錄裡的工具正常執行,這也就是 JDK 安裝目錄下為什麼會有一個 jre 子資料夾的原因。

同時,由於這個 jre 同樣也可以完成單獨的 JRE 所提供的功能,所以 Java 開發人員只需要安裝 JDK 而並不需要安裝單獨的 JRE。

下邊就對上面所講的進行一個簡單的總結:

JVM 是 Java 語言跨平臺的核心;

JRE 是執行 Java 程式的必需環境;

JDK 是面向開發人員的,並且自帶一個專用 JRE。