JVM、JRE、JDK之間的聯(lián)系及區(qū)別說(shuō)明
JVM (Java Virtual Machine)
JVM(Java虛擬機(jī))是一個(gè)可執(zhí)行Java字節(jié)碼的虛擬機(jī)進(jìn)程,用于解析編譯后的字節(jié)碼文件。 JVM屏蔽了與操作系統(tǒng)平臺(tái)相關(guān)的信息,可以把字節(jié)碼解釋成具體平臺(tái)上的機(jī)器指令執(zhí)行,這也是Java的能夠 “一次編譯,到處運(yùn)行” 的原因。
既然JVM是“虛擬機(jī)”的意思,那么肯定要體現(xiàn)出來(lái) : 可以把JVM類比為一臺(tái)只針對(duì)Java程序的PC虛擬機(jī),它通過(guò)實(shí)體計(jì)算機(jī)仿真各種計(jì)算功能來(lái)實(shí)現(xiàn),JVM有自己完善的硬件架構(gòu),如處理器,堆棧,寄存器等,還有相應(yīng)的指令集.
在Java的世界中,JVM的地位就像一臺(tái)PC機(jī)器。JVM和PC物理機(jī)的宏觀關(guān)系是這樣的 :

JVM與物理PC的微觀關(guān)系是這樣的 :

Java世界中JVM與現(xiàn)實(shí)世界中的物理PC之間關(guān)系是這樣的:

注意事項(xiàng):
JVM的核心任務(wù)是解釋字節(jié)碼文件,它不能運(yùn)行字節(jié)碼文件。因?yàn)镴VM執(zhí)行class還需要JRE下的lib類庫(kù)的支持,尤其是rt.jar,這一點(diǎn)非常重要。
JRE (Java Runtime Environment)
光有JVM還不能完成class的執(zhí)行,需要搭配JRE才能正常運(yùn)行程序員打好的jar包。因?yàn)樵诮忉宑lass的時(shí)候JVM需要調(diào)用解釋所需要的類庫(kù)lib,JRE里有運(yùn)行.class的java.exe.
JRE是Java程序的運(yùn)行環(huán)境,它包含JVM的標(biāo)準(zhǔn)實(shí)現(xiàn)及Java核心類庫(kù)。需要注意的是 : JRE是Java的運(yùn)行環(huán)境不是開發(fā)環(huán)境。JRE不包含任何開發(fā)工具,如:編譯器、調(diào)試器等,因?yàn)镴RE是面向Java程序(jar包)的,程序只需要運(yùn)行不需要編譯、調(diào)試等功能。如果只需要運(yùn)行一些Java程序,只需要一個(gè)JRE就足夠了,不需要安裝JDK.
在Java的世界中,JRE的地位相當(dāng)于是一臺(tái)PC機(jī)器中的Windows操作系統(tǒng). Windows操作系統(tǒng)可以運(yùn)行.exe格式化的應(yīng)用程序?qū)?yīng)的JRE操作系統(tǒng)用于運(yùn)行.jar格式的應(yīng)用程序。
綜上所述,Java世界中的JRE與現(xiàn)實(shí)世界中的PC操作系統(tǒng)之間關(guān)系是這樣的 :

JDK (Java Development Kit)
JDK是java開發(fā)工具包,它提供了編譯、運(yùn)行Java程序所需的各種工具和資源,包括Java編譯器、Java運(yùn)行時(shí)環(huán)境,以及常用的Java類庫(kù)等。JDK是面向程序員的。
基本上每個(gè)學(xué)java的人都會(huì)先在機(jī)器 上裝一個(gè)JDK,那它都包含哪幾部分呢?
安裝完jdk之后,切換至jdk的安裝根目錄,可以看到幾個(gè)目錄:bin、jre、src.zip、db、lib、include。
bin:開發(fā)工具。里面可以看到一些我們很熟悉的工具,jar、java、javac、javadoc、javap、jconsole、jhat、jmap、jstack、jstat。jre:Java運(yùn)行時(shí)環(huán)境。JRE包括Java虛擬機(jī)(JVM),類庫(kù)和其他支持執(zhí)行用Java編程語(yǔ)言編寫的程序的文件(我們開發(fā)過(guò)程中經(jīng)常使用到的核心類庫(kù)就是在/jre/lib下)。src.zip:Java類庫(kù)源代碼。構(gòu)成Java核心API的所有類的Java編程語(yǔ)言源文件,(注意不是JVM源碼)主要是想幫助開發(fā)人員學(xué)習(xí)和使用Java編程語(yǔ)言。db:Oracle分發(fā)的Apache Derby關(guān)系數(shù)據(jù)庫(kù)。lib:其他庫(kù),開發(fā)工具所需的其他類庫(kù)和支持文件,其中就有我們比較熟悉的dt.jar和tools.jar。include:支持使用Java Native Interface和Java Virtual Machine(JVM)調(diào)試器接口進(jìn)行本機(jī)代碼編程的C語(yǔ)言頭文件。
既然JDK安裝目錄中是包含JRE的,而JRE中是包含JVM的,所以電腦安裝完JDK后就具備了開發(fā)Java源文件、編譯class字節(jié)碼文件、運(yùn)行jar程序的功能。JDK直接打通了程序員與Java世界的壁壘,這就導(dǎo)致筆者到現(xiàn)在才搞清楚它們?nèi)咧g的關(guān)系,。
JVM、JRE、JDK三者之間的聯(lián)系
綜上所述,三者關(guān)系可以用下面一個(gè)場(chǎng)景來(lái)總結(jié):
程序員借助JDK可以寫好.Java源代碼,然后使用JDK自帶的javac命令將源代碼編譯為.class字節(jié)碼文件,最后使用JDK的jar -cvf命令打包為jar包,到這一步JDK的使命就完成了。
有了jar包之后,下一步就是讓jar跑起來(lái),這一步就該JVM、JRE出場(chǎng)了,使用java -jar運(yùn)行程序。
首先是在JRE上運(yùn)行這些字節(jié)碼,具體到字節(jié)碼執(zhí)行時(shí)就需要JVM解析字節(jié)碼文件,并承擔(dān)將字節(jié)碼命令映射到CPU指令集或OS的系統(tǒng)調(diào)用。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot快速搭建web項(xiàng)目詳細(xì)步驟總結(jié)
這篇文章主要介紹了SpringBoot快速搭建web項(xiàng)目詳細(xì)步驟總結(jié) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)權(quán)限校驗(yàn)的過(guò)程
Spring Security過(guò)濾器鏈中,AuthorizationFilter的authorizationManager是我們要找的組件,該組件的check方法已被棄用,推薦使用authorize方法,最終通過(guò)接口路徑和權(quán)限進(jìn)行校驗(yàn),本文給大家介紹SpringSecurity實(shí)現(xiàn)動(dòng)態(tài)權(quán)限校驗(yàn)的相關(guān)知識(shí),感興趣的朋友一起看看吧2025-02-02
新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法
這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10
實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢
這里我們來(lái)以實(shí)例講解Java的MyBatis框架對(duì)MySQL中數(shù)據(jù)的關(guān)聯(lián)查詢,包括一對(duì)多、多對(duì)一的關(guān)聯(lián)查詢以及自身關(guān)聯(lián)映射的方法等,需要的朋友可以參考下2016-06-06
jdbc實(shí)現(xiàn)寵物商店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了jdbc實(shí)現(xiàn)寵物商店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

