大多數人剛接觸Java的時候都會經常看到JDK、JRE、JVM,但可能一直迷迷糊糊,不知道它們之間真正的作用和含義,而瞭解JDK、JRE、JVM分別是什麼及它們之間的關係有助於我們更加深刻的理解java語言的特性。
Java程序是運行在JVM(Java虛擬機)上的,在開發程序之前要配置Java開發環境,而配置環境要做的就是JDK的安裝和配置。
三者的大致結構是這樣的,簡單來說就是JDK包含JRE,JRE又包含JVM的關係。如下圖所示:
JDK簡單介紹
JDK:Java Development Kit 是Java的標準開發工具包(普通用戶只需要安裝 JRE來運行 Java 程序。而程序開發者必須安裝JDK來編譯、調試程序)。它提供了編譯、運行Java程序所需的各種工具和資源,包括Java編譯器、Java運行環境JRE,以及常用的Java基礎類庫等,是整個JAVA的核心。
JDK一般有三種版本:
SE(J2SE),standard edition,標準版,是我們通常用的一個版本 EE(J2EE),enterpsise edtion,企業版,使用這種JDK開發J2EE應用程序, ME(J2ME),micro edtion,主要用於移動設備、嵌入式設備上的java應用程序 (相對來說現在使用的很少了)
JDK安裝目錄下各個子文件目錄和文檔作用的詳細介紹
下圖是Java8中JDK的安裝目錄
bin文件裡面存放了JDK的各種開發工具的可執行文件,主要的是編譯器(javac.exe)
db文件是一個先進的全事務處理的基於Java技術的數據庫(jdk自帶數據庫db的使用)
include文件裡面是Java和jvm交互用的頭文件
jre為java運行環境
lib文件存放的是JDK工具命令的實際執行程序
JRE
JRE:Java runtime environment 是運行基於Java語言編寫的程序所不可缺少的運行環境,用於解釋執行Java的字節碼文件。
也是通過它,Java的開發者才得以將自己開發的程序發佈到用戶手中,讓用戶使用。JRE中包含了Java virtual machine(JVM),runtime class libraries和Java application launcher,這些是運行Java程序的必要組件。與大家熟知的JDK不同,JRE是Java運行環境,並不是一個開發環境,所以沒有包含任何開發工具(如編譯器和調試器),只是針對於使用Java程序的用戶。
下圖是Java8中JRE的安裝目錄,裡面有兩個文件夾bin和lib。你可以認為bin裡的就是JVM,lib中則是JVM工作所需要的類庫,而JVM和 lib和起來就稱為JRE
從JDK11開始,JDK和JRE都是在一起的,安裝後默認是沒有JRE的。如果需要JRE這個單獨目錄,可以在JDK目錄下面去打開命令窗口,然後執行如下命令(win10執行這個生成JRE需要目錄權限):
bin\\jlink.exe --module-path jmods --add-modules java.desktop --output jre
執行完之後就會生成JRE,但無論使用tomcat 還是eclipse,沒有JRE文件夾實際上並不影響你的使用。
JVM
JVM:Java Virtual Machine 是Java的虛擬機,是JRE的一部分。它是整個java實現跨平臺的最核心的部分,負責解釋執行字節碼文件,是可運行java字節碼文件的虛擬計算機。
所有平臺的上的JVM向編譯器提供相同的接口,而編譯器只需要面向虛擬機,生成虛擬機能識別的代碼,然後由虛擬機來解釋執行。
Java跨平臺的原因
使用Java編譯器編譯Java程序時,生成的是與平臺無關的字節碼,這些字節碼只面向JVM。不同平臺的JVM都是不同的,但它們都提供了相同的接口。
JVM是Java程序跨平臺的最核心的部分,只要為不同平臺實現了相應的虛擬機,編譯後的Java字節碼就可以在該平臺上運行。其屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。
正是因為有了JVM的存在,Java才實現了強大的跨平臺特性。
jvm執行程序的過程
1、加載.class 文件
所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機上執行。也就是說class並不直接與機器的操作系統相對應,而是經過虛擬機間接與操作系統交互,由虛擬機將程序解釋給本地系統執行。只有JVM還不能成功執行.class的類文件,因為在解釋class的時候JVM需要調用解釋所需要的類庫lib,而jre包含lib類庫。
運行class文件
可以在命令行中輸入 java 字節碼文件名 ,此時啟動了一個jvm,加載字節碼文件名.class字節碼文件到內存,然後jvm運行內存中的字節碼指令
在IDE上就類似於點擊運行按鈕。
2、管理並分配內存
3、執行垃圾收集調用垃圾收集器進行垃圾回收
三者的區別與聯繫
- JDK用於開發,是給開發人員用的,JRE 用於運行java程序,和JVM是給普通用戶使用的。如果只是運行Java程序,可以只安裝JRE,無序安裝JDK。也就是說:使用JDK開發完成的java程序,交給JRE去運行。
- JDK包含了JRE,JDK 和 JRE 中都包含 JVM。也可以說JDK是JRE+Java的開發工具。JRE包含了JVM+Java語言的核心類庫。
閱讀更多 程序猿的內心獨白 的文章