弄懂 JRE、JDK、JVM 之間的區別與聯繫

其實不少 Java 程序員在寫了不少代碼後,你問他 jre 和 jdk 之間有什麼關係,jvm 又是什麼東西,不少人不知所云。本篇不會講述 jvm 底層是如何與不一樣的系統進行交互的,而主要理清楚三者之間的區別,搞清楚咱們寫的 xxx.java 文件是被誰編譯,又被誰執行,爲何可以跨平臺運行。java

首先,咱們分別對這三者進行闡述。git

JVM :英文名稱(Java Virtual Machine),就是咱們耳熟能詳的 Java 虛擬機。它只認識 xxx.class 這種類型的文件,它可以將 class 文件中的字節碼指令進行識別並調用操做系統向上的 API 完成動做。因此說,jvm 是 Java 可以跨平臺的核心,具體的下文會詳細說明。程序員

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

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

顯然,這三者的關係是:一層層的嵌套關係。JDK>JRE>JVMjvm

接着,提出一個問題:爲何咱們的電腦在裝完 jdk 後會有兩個版本的 jre工具

留心的同窗可能會發現,咱們的 jdk 安裝成功後,在 C:\Program Files\Java 目錄會是這樣的(這裏,我是裝的 jdk1.8 的版本)學習

image

而 jdk 的子目錄下也存在一個 jre。開發工具

image

這兩個不一樣版本的 jre 相互之間有什麼聯繫嗎?操作系統

答案是:沒有聯繫。甚至準確的來講,它倆是同樣的,不管是用哪個都是能夠的。只是不少人習慣將會單獨安裝另外一個 jre,雖然單獨安裝的 jre 也並無被使用,緣由可能就是剛開始你們都不清楚 jdk 和 jre 之間的關係,因此就默認的都安裝上了。

在 jdk 的 bin 目錄下,基本上都是一些可執行文件,而且它們還不大。其實這些可執行文件只是外層的一層封裝而已,這樣的目的是避免輸入的命令過長。例如 javac.exe 內部調用的實際上是 JDK 中 lib 目錄中的 tools.jar 中 com.sun.tools.javac.Main 類,也就是說這些工具只是入口而已。而實際上它們自己又都是由 Java 編寫的,因此在 jdk 目錄下的 jre 既提供了這些工具的運行時環境,也提供了咱們編寫完成的 Java 程序的運行時環境。

因此,很明顯,jdk 是咱們的開發工具包,它集成了 jre ,所以咱們在安裝 jdk 的時候能夠選擇再也不安裝 jre 而直接使用 jdk 中的 jre 運行咱們的 Java 程序。(可是大部分人都默認將兩個都裝上了)。可是若是你的電腦不是用來開發 Java 程序的,而僅僅是用來部署和運行 Java 程序的,那麼徹底能夠不用安裝 jdk,只須要安裝 jre 便可。

下一個問題,Java 爲何能跨平臺,實現一次編寫,多處運行?

Java 可以跨平臺運行的核心在於 JVM 。不是 Java 可以跨平臺,而是它的 jvm 可以跨平臺。咱們知道,不一樣的操做系統向上的 API 確定是不一樣的,那麼若是咱們想要寫一段代碼調用系統的聲音設備,就須要針對不一樣系統的 API 寫出不一樣的代碼來完成動做。

而 Java 引入了字節碼的概念,jvm 只能認識字節碼,並將它們解釋到系統的 API 調用。針對不一樣的系統有不一樣的 jvm 實現,有 Linux 版本的 jvm 實現,也有 Windows 版本的 jvm 實現,可是同一段代碼在編譯後的字節碼是同樣的。引用上面的例子,在 Java API 層面,咱們調用系統聲音設備的代碼是惟一的,和系統無關,編譯生成的字節碼也是惟一的。可是同一段字節碼,在不一樣的 jvm 實現上會映射到不一樣系統的 API 調用,從而實現代碼的不加修改便可跨平臺運行。

本篇文章主要描述了 Java 相關的最基本的概念,理解了這幾個基本的概念後,後續的學習纔會有根有據,不會稀裏糊塗的。

文章中的全部代碼、圖片、文件都雲存儲在個人 GitHub 上:

(https://github.com/SingleYam/overview_java)

歡迎關注微信公衆號:撲在代碼上的高爾基,全部文章都將同步在公衆號上。

image

相關文章
相關標籤/搜索