Java基础:JDK、JRE、JVM的区别与联系
1. 詳細介紹
1.1 JVM – java virtual machine
JVM就是我們常說的java虛擬機,它是整個java實現(xiàn)跨平臺的 最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可 以在虛擬機上執(zhí)行,也就是說class并不直接與機器的操作系統(tǒng)相對應,而是經(jīng)過虛擬機間接與操作系統(tǒng)交互,由虛擬機將程序解 釋給本地系統(tǒng)執(zhí)行。
JVM 是 Java 平臺的基礎(chǔ),和實際的機器一樣,它也有自己的指令集,并且在運行 時操作不同的內(nèi)存區(qū)域。 JVM 通過抽象操作系統(tǒng)和 CPU 結(jié)構(gòu),提供了一種與平臺無關(guān)的代碼執(zhí)行方法,即與特殊的實現(xiàn)方 法、主機硬件、主機操作系統(tǒng)無關(guān)。但是在一些小的方面, JVM 的實現(xiàn)也是互不相同的,比如垃圾回收 算法,線程調(diào)度算法(可能不同 OS 有不同的實現(xiàn))。
JVM 的主要工作是解釋自己的指令集(即字節(jié)碼)到 CPU 的指令集或 OS 的系統(tǒng)調(diào)用,保護用戶免被惡意程序騷擾。 JVM 對上層的 Java 源文件是不關(guān)心的,它關(guān)注的只是由源文件生成的類文件( class file )。類文件的 組成包括 JVM 指令集,符號表以及一些補助信息。
1.2 JRE – java runtime environment
JRE是指java運行環(huán)境。光有JVM還不能成class的 執(zhí)行,因為在解釋class的時候JVM需要調(diào)用解釋所需要的類庫lib。 在JDK的安裝目 錄里你可以找到jre目錄,里面有兩個文件夾bin和lib,在 這里可以認為bin里的就是jvm,lib中則是jvm工 作所需要的類庫,而jvm和 lib和起來就稱為jre。所以,在你寫完java程序編譯成.class之后,你可以把這個.class文件 和jre一起打包發(fā)給朋友,這樣你的朋友就 可以運行你寫程序了。(jre里有運行.class的java.exe)
JRE 是 Sun 公司發(fā)布的一個更大的系統(tǒng),它里面就有一個 JVM 。 JRE 就與具體的 CPU 結(jié)構(gòu)和操作系統(tǒng)有關(guān),我們從 Sun 下載 JRE 的時候就看到了不同的各種版本。同 JVM 一起組成 JRE 的還有一些 API (如 awt , swing 等)。 JRE 是運行 Java 程序必不可少的。
JRE ( Java Runtime Environment ),是運行 Java 程序必不可少的(除非用其他一些編譯環(huán)境編譯成.exe可執(zhí)行文件……),JRE的 地位就象一臺PC機一樣,我們寫好的Win32應用程序需要操作系統(tǒng)幫 我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。
JRE里面有一個 JVM , JRE 與具體的 CPU 結(jié)構(gòu)和操作系統(tǒng)有關(guān),我們從 Sun 下載 JRE 的時候就看到了不同的各種版本,,同 JVM 一起組成 JRE 的還有 一些 API (如 awt , swing 等), JRE 是 運行 Java 程序必不可少的.
1.3 JDK – java development kit
JDK是java開發(fā)工具包,基本上每個學java的人都會先在機器 上裝一個JDK,那他都包含哪幾部分呢?讓我們看一下JDK的安裝目錄。在目錄下面有 六個文件夾、一個src類庫源碼壓縮包、和其他幾個聲明文件。其中,真正在運行java時起作用的 是以下四個文件夾:bin、include、lib、 jre。現(xiàn)在我們可以看出這樣一個關(guān)系,JDK包含JRE,而JRE包 含JVM。
- bin:最主要的是編譯器(javac.exe)
- include:java和JVM交互用的頭文件
- lib:類庫
- jre:java運行環(huán)境
注意:這里的bin、lib文件夾和jre里的bin、lib是 不同的,總的來說JDK是用于java程序的開發(fā),而jre則 是只能運行class而沒有編譯的功能。eclipse、idea等 其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時你會發(fā)現(xiàn)他們只要求你 選中jre路徑就ok了。
2. 三者聯(lián)系
Java 喊出的帶有標志性的口號“ Write Once , Run Anywhere (一次編寫,到處運行)”,正是建立在 JRE 的基礎(chǔ)之上。何以實現(xiàn)?就是在 Java 應用程序和操作系統(tǒng)之間增加了一虛擬層—— JRE 。
程序源代碼不是直 接編譯、鏈接成機器代碼,而是先轉(zhuǎn)化到字節(jié)碼( bytecode ) 這種特殊的中間形式,字節(jié)碼再轉(zhuǎn)換成機器碼或系統(tǒng)調(diào)用。前者是傳統(tǒng)的編譯方法,生成的機器代碼就不可避免地跟特殊的操作系統(tǒng)和特殊的機器結(jié)構(gòu)相關(guān)。
而 Java 程序的字節(jié)碼文件可以放到任意裝有 JRE 的計算機運行,再由不同 JRE 的將它們轉(zhuǎn)化成相應的機器代碼,這就實現(xiàn)了 Java 程序的可移植性。這樣程序員也不用去關(guān)心程序運行的具體環(huán)境,而可以專心編寫軟件。這種分層抽象、隱藏細節(jié)的思想在計算機科學中處處可見,比如機器組織結(jié)構(gòu)的設(shè)計、網(wǎng)絡協(xié)議的實現(xiàn)等。 Pascal 語言的發(fā)明者 Niklaus Wirth ,就富有預見性地指出應該有這樣一種可移植的語言,其生成的中間代碼可以在一臺假想的機器( a hypothetical machine )上運行。
而 Java 虛擬機( Java virtual machine 或 JVM )就是這樣的一臺機器,它模擬實際處理器的結(jié)構(gòu),解釋字節(jié)碼。 怎么一會說是 JRE ,一會兒又成了 JVM ,兩者是否同物不同名? 回答是否定的。
JRE的地位就象一臺PC機一樣,我們寫好的Win32應用程序需要操作系統(tǒng)幫 我們運行,同樣的,我們編寫的Java程序也必須要JRE才能運行。
要運行Applet,在客戶端必須安裝有 JRE,即“運行時”,容易一點理解,就象所謂的“插件”,要開發(fā)JAVA應用程序\Web應用,就必須在服務器端安裝相應的 JVM+JDK 了(開發(fā)應用 Java web應用 時,客戶端不需要安裝任何的JVM)
如果你使用JAVA開發(fā)應用,就需要安裝 JRE+JDK,就是 J2SE
如果在客戶端運行Applet,客戶端瀏覽器必須嵌有JAVA JVM,如果沒有,就需要安裝,即:在客戶端創(chuàng)建JRE(運行時,包含JVM),而客戶端是不需要做開發(fā)的,所以,JDK就沒有必要安裝 了
不同版本的Applet在不同的JVM下可能無法正常運行,而Microsoft JVM只是Sun JVM的“低版本”,微軟在windows xp/2003中干脆將JVM去掉了
總結(jié)
以上是生活随笔為你收集整理的Java基础:JDK、JRE、JVM的区别与联系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android java.lang.Un
- 下一篇: Java基础:常用IO流