jre、jdk、jvm之間的關系


很多Java的程序員在寫了很多代碼之后,你問他JRE和JDK是是什么關系,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?

留心的同學可能會發現,我們的JDK在安裝成功后,在C:\Program Files\Java目錄會是這樣的(這里,我是裝的JDK1.8的版本):

在Java根目錄下有個JRE,在JDK目錄下也有個JRE,那么這兩個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為什么能跨平台,實現一次編寫,多處運行(Once write, run anywhere)?

Java能夠跨平台運行的核心在於JVM。不是Java能夠跨平台,而是它的JVM能夠跨平台。我們知道,不同的操作系統上操作的API肯定是不同的,那么如果我們想要寫一段代碼調用系統的聲音設備,就需要針對不同系統的API寫出不同的代碼來完成動作。而Java引入了字節碼的概念,JVM也只能認識字節碼,並將它們解釋到系統的API調用。針對不同系統有不同的JVM實現,有Linux版本的JVM實現,也有Windows版本的JVM實現,但是同一段代碼在編譯后的字節碼是完全一樣的。引用前面的例子,在Java API層面,我們調用系統聲音設備的代碼是一樣的,和系統無關,編譯后生成的字節碼也是唯一的。但是對於同一段字節碼,在不同的JVM實現上會映射到不同系統的API調用,從而實現代碼的不加修改即可跨平台運行。

 

"把你的精力用在能得到回報的地方。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM