Java基礎:JDK、JRE、JVM的區別與聯絡
1. 詳細介紹
1.1 JVM – java virtual machine
JVM就是我們常說的java虛擬機器,它是整個java實現跨平臺的 最核心的部分,所有的java程式會首先被編譯為.class的類檔案,這種類檔案可 以在虛擬機器上執行,也就是說class並不直接與機器的作業系統相對應,而是經過虛擬機器間接與作業系統互動,由虛擬機器將程式解 釋給本地系統執行。
JVM 是 Java 平臺的基礎,和實際的機器一樣,它也有自己的指令集,並且在執行 時操作不同的記憶體區域。 JVM 通過抽象作業系統和 CPU 結構,提供了一種與平臺無關的程式碼執行方法,即與特殊的實現方 法、主機硬體、主機作業系統無關。但是在一些小的方面, JVM 的實現也是互不相同的,比如垃圾回收 演算法,執行緒排程演算法(可能不同 OS 有不同的實現)。
JVM 的主要工作是解釋自己的指令集(即位元組碼)到 CPU 的指令集或 OS 的系統呼叫,保護使用者免被惡意程式騷擾。 JVM 對上層的 Java 原始檔是不關心的,它關注的只是由原始檔生成的類檔案( class file )。類檔案的 組成包括 JVM 指令集,符號表以及一些補助資訊。
1.2 JRE – java runtime environment
JRE是指java執行環境。光有JVM還不能成class的 執行,因為在解釋class的時候JVM需要呼叫解釋所需要的類庫lib。 在JDK的安裝目 錄裡你可以找到jre目錄,裡面有兩個資料夾bin和lib,在 這裡可以認為bin裡的就是jvm,lib中則是jvm工 作所需要的類庫,而jvm和 lib和起來就稱為jre。所以,在你寫完java程式編譯成.class之後,你可以把這個.class檔案 和jre一起打包發給朋友,這樣你的朋友就 可以執行你寫程式了。(jre裡有執行.class的java.exe)
JRE 是 Sun 公司釋出的一個更大的系統,它裡面就有一個 JVM 。 JRE 就與具體的 CPU 結構和作業系統有關,我們從 Sun 下載 JRE 的時候就看到了不同的各種版本。同 JVM 一起組成 JRE 的還有一些 API (如 awt , swing 等)。 JRE 是執行 Java 程式必不可少的。
JRE ( Java Runtime Environment ),是執行 Java 程式必不可少的(除非用其他一些編譯環境編譯成.exe可執行檔案……),JRE的 地位就象一臺PC機一樣,我們寫好的Win32應用程式需要作業系統幫 我們執行,同樣的,我們編寫的Java程式也必須要JRE才能執行。
JRE裡面有一個 JVM , JRE 與具體的 CPU 結構和作業系統有關,我們從 Sun 下載 JRE 的時候就看到了不同的各種版本,,同 JVM 一起組成 JRE 的還有 一些 API (如 awt , swing 等), JRE 是 執行 Java 程式必不可少的.
1.3 JDK – java development kit
JDK是java開發工具包,基本上每個學java的人都會先在機器 上裝一個JDK,那他都包含哪幾部分呢?讓我們看一下JDK的安裝目錄。在目錄下面有 六個資料夾、一個src類庫原始碼壓縮包、和其他幾個宣告檔案。其中,真正在執行java時起作用的 是以下四個資料夾:bin、include、lib、 jre。現在我們可以看出這樣一個關係,JDK包含JRE,而JRE包 含JVM。
- bin:最主要的是編譯器(javac.exe)
- include:java和JVM互動用的標頭檔案
- lib:類庫
- jre:java執行環境
注意:這裡的bin、lib資料夾和jre裡的bin、lib是 不同的,總的來說JDK是用於java程式的開發,而jre則 是隻能執行class而沒有編譯的功能。eclipse、idea等 其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時你會發現他們只要求你 選中jre路徑就ok了。
2. 三者聯絡
Java 喊出的帶有標誌性的口號“ Write Once , Run Anywhere (一次編寫,到處執行)”,正是建立在 JRE 的基礎之上。何以實現?就是在 Java 應用程式和作業系統之間增加了一虛擬層—— JRE 。
程式原始碼不是直 接編譯、連結成機器程式碼,而是先轉化到位元組碼( bytecode ) 這種特殊的中間形式,位元組碼再轉換成機器碼或系統呼叫。前者是傳統的編譯方法,生成的機器程式碼就不可避免地跟特殊的作業系統和特殊的機器結構相關。
而 Java 程式的位元組碼檔案可以放到任意裝有 JRE 的計算機執行,再由不同 JRE 的將它們轉化成相應的機器程式碼,這就實現了 Java 程式的可移植性。這樣程式設計師也不用去關心程式執行的具體環境,而可以專心編寫軟體。這種分層抽象、隱藏細節的思想在電腦科學中處處可見,比如機器組織結構的設計、網路協議的實現等。 Pascal 語言的發明者 Niklaus Wirth ,就富有預見性地指出應該有這樣一種可移植的語言,其生成的中間程式碼可以在一臺假想的機器( a hypothetical machine )上執行。
而 Java 虛擬機器( Java virtual machine 或 JVM )就是這樣的一臺機器,它模擬實際處理器的結構,解釋位元組碼。 怎麼一會說是 JRE ,一會兒又成了 JVM ,兩者是否同物不同名? 回答是否定的。
JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程式需要作業系統幫 我們執行,同樣的,我們編寫的Java程式也必須要JRE才能執行。
要執行Applet,在客戶端必須安裝有 JRE,即“執行時”,容易一點理解,就象所謂的“外掛”,要開發JAVA應用程式\Web應用,就必須在伺服器端安裝相應的 JVM+JDK 了(開發應用 Java web應用 時,客戶端不需要安裝任何的JVM)
如果你使用JAVA開發應用,就需要安裝 JRE+JDK,就是 J2SE
如果在客戶端執行Applet,客戶端瀏覽器必須嵌有JAVA JVM,如果沒有,就需要安裝,即:在客戶端建立JRE(執行時,包含JVM),而客戶端是不需要做開發的,所以,JDK就沒有必要安裝 了
不同版本的Applet在不同的JVM下可能無法正常執行,而Microsoft JVM只是Sun JVM的“低版本”,微軟在windows xp/2003中乾脆將JVM去掉了