qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          Java中JDK,JRE和JVM之間的關(guān)系

            初學(xué)JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先從概念上理解一下吧,JDK(Java Development Kit)簡單理解就是Java開發(fā)工具包,JRE(Java Runtime Enviroment)是Java的運(yùn)行環(huán)境,JVM( java virtual machine)也就是常常聽到Java虛擬機(jī)。JDK是面向開發(fā)者的,JRE是面向使用JAVA程序的用戶,上面只是簡單的區(qū)別,一般網(wǎng)上好多都講概念,我就不講了,直接截圖應(yīng)該會更清晰一點(diǎn),我安裝的JDK1.8,效果如圖:
            JDK和JRE
            通過上圖發(fā)現(xiàn)發(fā)現(xiàn)有兩個JRE文件夾,如果細(xì)看里面的內(nèi)容基本上是一樣的,如果是只是Java程序使用者,那么只會有最外層的那個JRE目錄,JDK中是JRE自帶的,你如果安裝了JDK必然里面會有一個JRE.那么問題來了,為什么會有兩套JRE呢?
            最開始使用JAVA的時候設(shè)置JAVA環(huán)境變量的時候除了設(shè)置JAVA_Home中JDK的路徑之外,還會需要設(shè)ClassPath,%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;dt.jar和tools.jar是兩個java最基本的包,里面包含了從java最重要的lang包到各種高級功能如可視化的swing包,是java必不可少的。而path下面的bin里面都是java的可執(zhí)行的編譯器及其工具,如java,javadoc等,你在任意的文件夾下面運(yùn)行cmd鍵入javac,系統(tǒng)就能自動召見java的編譯器就是歸功于這個環(huán)境變量的設(shè)置  ;如果修改其中tools.jar的名字,cmd運(yùn)行的時候會報錯:
            報錯的原因就是輸入的javac的命令不是去JDK中bin目錄去找的javac.exe,而是去JDK中l(wèi)ib目錄中的tools.jar中com.sun.tools.javac.Main中執(zhí)行,因此javac.exe只是一個包裝器(Wrapper),存在的目的是為了讓開發(fā)者免于輸入過長的指命。這個時候發(fā)現(xiàn)JDK里的工具幾乎是用Java所編寫,同屬于Java應(yīng)用程序,因此要使用JDK所附的工具來開發(fā)Java程序,所以自身需要附一套JRE才能運(yùn)行。上圖中與jdk同級目錄下的JRE就是用來運(yùn)行一般Java程序用的。
            兩套JRE運(yùn)行的時候究竟運(yùn)行哪一個呢,這個時候JDK中java.exe先從自身目錄中找,然后父級目錄中找,如果都沒有就去注冊表中找:
            所以java.exe的運(yùn)行結(jié)果與你的電腦里面哪個JRE被執(zhí)行有很大的關(guān)系,JDK和JRE應(yīng)該算是說完了,下面說說JRE和JVM.
          JRE和JVM
            JVM -- java virtual machineJVM就是我們常說的java虛擬機(jī),它是整個java實(shí)現(xiàn)跨平臺的最核心的部分,所有的java程序會首先被編譯為.class的類文件,這種類文件可以在虛擬機(jī)上執(zhí)行,class文件并不直接與機(jī)器的操作系統(tǒng)相對應(yīng),而是經(jīng)過虛擬機(jī)間接與操作系統(tǒng)交互,由虛擬機(jī)將程序解釋給本地系統(tǒng)執(zhí)行,類似于C#中的CLR。
            JVM不能單獨(dú)搞定class的執(zhí)行,解釋class的時候JVM需要調(diào)用解釋所需要的類庫lib。在JDK下面的的jre目錄里面有兩個文件夾bin和lib,在這里可以認(rèn)為bin里的就是jvm,lib中則是jvm工作所需要的類庫,而jvm和 lib和起來就稱為jre。JVM+Lib=JRE,如果講的具體點(diǎn)就是bin目錄下的jvm.dll文件, jvm.dll無法單獨(dú)工作,當(dāng)jvm.dll啟動后,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態(tài)鏈接庫),而這些輔助用的動態(tài)鏈接庫(.dll)都必須位 于jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設(shè)置PATH,指向JRE所在目錄下的jvm.dll。
            JDK在目前為止還是模糊的概念,這個時候可以通過JDK的目錄文件來看下:
            在目錄下面有五個文件夾、一個src類庫源碼壓縮包和幾個聲明文件,其他五個文件夾分別是:bin、db、include、lib、 jre,db這個文件看業(yè)務(wù)需求~
            bin:最主要的是編譯器(javac.exe);
            db:jdk從1.6之后內(nèi)置了Derby數(shù)據(jù)庫,它是是一個純用Java實(shí)現(xiàn)的內(nèi)存數(shù)據(jù)庫,屬于Apache的一個開源項目。用Java實(shí)現(xiàn)的,所以可以在任何平臺上運(yùn)行;另外一個特點(diǎn)是體積小,免安裝,只需要幾個小jar包就可以運(yùn)行了。
            include:java和JVM交互用的頭文件;
            lib:常用類庫
            jre:java運(yùn)行環(huán)境
            JDK包含JRE,而JRE包含JVM,總的來說JDK是用于java程序的開發(fā),而jre則是只能運(yùn)行class而沒有編譯的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的編譯器而不是用JDK bin目錄中自帶的,所以在安裝時只需選中jre路徑就ok了,最后用張網(wǎng)絡(luò)圖片總結(jié)下吧:

          posted on 2014-11-13 10:15 順其自然EVO 閱讀(286) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 郓城县| 金塔县| 连江县| 会同县| 沂源县| 策勒县| 射阳县| 台江县| 安塞县| 新巴尔虎左旗| 舒兰市| 涪陵区| 呼图壁县| 建平县| 木兰县| 辉南县| 东丽区| 聂荣县| 西充县| 汉源县| 梅河口市| 家居| 从化市| 庐江县| 阳新县| 临潭县| 咸丰县| 维西| 逊克县| 富民县| 云林县| 偃师市| 兴仁县| 西乌| 辉南县| 建始县| 咸宁市| 万州区| 泌阳县| 台山市| 郯城县|