深入理解JDK、JRE(兩套)、JVM、以及不同目錄下的java.exe


內容來自:http://blog.sina.com.cn/s/blog_7ffb8dd501011sgc.html

1、jdk下bin目錄里的java.exe與外部jre中的java.exe的秘密
    jdk里的java.exe和jre中的java.exe其實是一樣的,但我們在運行的時候用的卻是優先使用外部jre中的java.exe(即使我們安裝了JDK且也配置了環境變量)。
 首先,我們看下JDK的安裝過程中發生了什么事:
    安裝JDK時一定會在其子目錄下面安裝一個JRE,同時在安裝的過程也會詢問你是否要安裝一 個外部的JRE。如果我們選擇安裝則就同時擁有了兩個jre。這兩個JRE其實本質上是沒有任何分別的。最主要的區別在於:JDK目錄里面的JRE主要是 設計用來運行JDK自帶的那些工具的(Bin目錄下)。而外部的JRE在安裝的時候會自動注冊到操作系統的path(但在 我的電腦\屬性\高級系統設置\環境變量\系統變量中的 path中並沒有包含該命令的路徑值)里面一般是:System32文件夾下 (該文件夾下包含:java.exe javaw.exe  javaws.exe 三個文件)面。因此我們只要安裝了外部的JRE(即使JDK沒有安裝,環境變量沒有配置)則運行Java程序時都是用的外部JRE的java.exe程序來運行的(即使安裝了JDK且配置了環境變量)(系統的默認path具有優先)。

2、 
     簡單的說JDK是面向開發人員使用的SDK 。SDK是Software Development Kit 一般指軟件開發包,可以包括函數庫、編譯程序等。
    JDK(JAVA Develop Kit,JAVA開發工具包)提供了Java的開發環境和運行環境,主要用於開發JAVA程序,面向Java程序的開發者;
    JRE(JAVA Runtime Environment,JAVA運行環境)提供了Java的運行環境,主要用於執行JAVA程序,面向Java程序的使用者。

    一般情況下,每個JDK里面包含兩套JRE。以JDK jdk1.6.0_22(默認安裝路徑是E:\Program Files\Java)為例,在E:\Program Files\Java\jdk1.6.0_22\目錄下有一個JRE,在C:\Program Files\Java\目錄下也有一個JRE。為什么會有兩套JRE呢?因為JDK里面的工具也是用JAVA編寫的,它們本身運行的時候也需要一套 JRE,即E:\Program Files\Java\jdk1.6.0_22\目錄下的JRE。而E:\Program Files\Java\目錄下的JRE是用來執行我們自己編寫的JAVA程序。當然,兩套JRE中的任何一套都可以用來執行我們自己編寫的JAVA程序, 但是JDK里面的工具只能由E:\Program Files\Java\jdk1.6.0_22\目錄下的JRE來執行。
    既然在我們的電腦里面至少有兩套JRE(如果安裝了Borland JBuilder等高級開發工具,電腦里面會有更多套的JRE),那么由誰來決定使用哪一套JRE呢?這個重擔就落在java.exe的身上。(當然對於 1 中我們安裝了JDK的情況下,默認就是外部的JRE執行了!!!)
    當我們在命令行輸入:
java xxx
的時候,java.exe的任務就是在我們電腦上眾多的JRE中找到合適的JRE來執行xxx。java.exe依據以下順序來尋找JRE:
    (1)自己的目錄下有沒有JRE目錄;
    (2)父目錄下有沒有JRE目錄;
    (3)查詢注冊表HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\
所以java.exe的執行結果與我們電腦里哪一個java.exe(搜索一下就會發現我們電腦里面也不止一個java.exe)被執行以及哪套JRE來執行JVA程序有很大的關系。
    另外,java.exe在找到合適的JRE以后,還有一個驗證版本的程序,也就是java.exe與JRE的版本一致才可以執行。如果出現版本不一致的問題,一定要記得兩件事情:
    (1)哪一個java.exe被執行;
    (2)java.exe找到哪一套JRE。
只要這兩件事情確定了,我們就抓住了問題的來龍去脈,解決起來也就輕而易舉了。

   3、

    JVM(JAVA Virtual Machine,JAVA虛擬機)是JRE的一部分,JRE是JVM的補充。那么JVM到底在哪里呢?我們打開C:\Program Files\Java\jdk1.5.x\jre\bin,會看到client和server兩個目錄,在這兩個目錄中分別可以看到jvm.dll,這就 是我們所說的JVM之所在。

 

補充: 
jdk的jre目錄下的Bin目錄有兩個目錄:server與client。這就是真正的jvm.dll所在。 jvm.dll無法單獨工作,當jvm.dll啟動后,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態鏈接庫),而這些輔助用的動態鏈接庫(.dll)都必須位於jvm.dll所在目錄的父目錄之中。因此想使用哪個JVM,只需要設置PATH,指向JRE所在目錄底下的jvm.dll


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM