深入理解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
深入理解JDK、JRE(兩套)、JVM、以及不同目錄下的java.exe