你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?

大多數人剛接觸Java的時候都會經常看到JDK、JRE、JVM,但可能一直迷迷糊糊,不知道它們之間真正的作用和含義,而瞭解JDK、JRE、JVM分別是什麼及它們之間的關係有助於我們更加深刻的理解java語言的特性。


Java程序是運行在JVM(Java虛擬機)上的,在開發程序之前要配置Java開發環境,而配置環境要做的就是JDK的安裝和配置。

三者的大致結構是這樣的,簡單來說就是JDK包含JRE,JRE又包含JVM的關係。如下圖所示:

你想了解JDK、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的安裝目錄

你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?

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程序的用戶。

你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?

下圖是Java8中JRE的安裝目錄,裡面有兩個文件夾bin和lib。你可以認為bin裡的就是JVM,lib中則是JVM工作所需要的類庫,而JVM和 lib和起來就稱為JRE

你想了解JDK、JRE、JVM分別是什麼及它們之間的有什麼關聯嗎?

從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語言的核心類庫。


分享到:


相關文章: