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

JVM與物理PC的微觀關系是這樣的 :

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

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

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

總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringSecurity實現(xiàn)動態(tài)權限校驗的過程
Spring Security過濾器鏈中,AuthorizationFilter的authorizationManager是我們要找的組件,該組件的check方法已被棄用,推薦使用authorize方法,最終通過接口路徑和權限進行校驗,本文給大家介紹SpringSecurity實現(xiàn)動態(tài)權限校驗的相關知識,感興趣的朋友一起看看吧2025-02-02
新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法
這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過代碼示例和圖文結合的方式給大家講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-10-10
實例講解Java的MyBatis框架對MySQL中數(shù)據(jù)的關聯(lián)查詢
這里我們來以實例講解Java的MyBatis框架對MySQL中數(shù)據(jù)的關聯(lián)查詢,包括一對多、多對一的關聯(lián)查詢以及自身關聯(lián)映射的方法等,需要的朋友可以參考下2016-06-06

