JDK JRE Java虛擬機的關係

安裝JDK時一定會在其子目錄下面安裝一個JRE,同時在安裝的過程也會詢問你是否要安裝一個外部的JRE。如果我們選擇安裝則就同時擁有了兩個jre。這兩個JRE其實本質上是沒有任何分別的。最主要的區別在於:JDK目錄裏面的JRE主要是設計用來運行JDK自帶的那些工具的(Bin目錄下)。而外部的JRE在安裝的時候會自動註冊到操作系統的path裏面一般是:System32文件夾下面。因此我們只要安裝了外部的JRE則運行Java程序時都是用的外部JRE來運行的(系統的默認path具有優先)。
JVM只是JRE的一部分確切的說是JRE的一個動態鏈接庫。
JDK裏面的工具(Bin目錄下的那些很小的.exe文件)幾乎都是用Java編寫的(都存放在JDK目錄下面的lib文件夾中的tools.jar文件中),之所以是以.exe文件的形式出現是爲了免於輸入冗長的執行代碼(java -classpath JDK_HOME\lib\tools.jar com.sun.tools.javac.Main)。此處的exe文件僅僅是一個包裝器以方便用戶的使用。很多軟件最後都打包成exe文件就是一種包裝器。因此這些包裝器的運行其實最終都是去調用tools裏面相應的Java字節碼來運行因此都依賴於JRE所以在JDK內部纔有一個JRE。
當我們電腦上安裝了JBuilder等開發工具時它們都自帶了自己的JDK,因此當我們運行Java程序的時候到底使用的哪一個JRE呢。這個是由java.exe文件來決定的。java.exe的作用就是找到相應的JRE來運行後面給出的.class文件。尋找邏輯如下:
首先在自己的目錄下面查找JRE若沒有找到,然後去父目錄下查找,最後去Windows的註冊表中(HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\)去找。而註冊表中一般只有Client而沒有Server虛擬機。所以輸入
java -server時候會說找不到。當然找到JRE以後還有一個版本驗證的過程,那就是驗證java.exe和此JRE版本是否一致,假若我們運行的是jdk1.3版本的java.exe文件然後找到的是卻是jdk1.4的jre程序就可能會出錯。
我們在JRE/bin目錄下面會看到有連個文件夾client和server。它們裏面都會有一個jvm.dll文件這就是所謂的虛擬機。
在我們運行java.exe文件的時候我們要確定兩個事情:
哪一個java.exe文件被執行,java.exe找到的是哪個JRE。
具體運行的是哪一個Java.exe主要取決於環境變量path的設置,對於Windows系統來說C:\Windows\System32是默認的。
因此我們再去添加指向我們安裝的java.exe的環境變量時要注意與系統環境變量的先後關係。
path=D:\JDK_HOME\bin;C:\Windows\System32(優先運行JDK_HOME裏面的java.exe)
和path=C:\Windows\System32;D:\JDK_HOME\bin;(優先運行系統目錄下的java.exe文件)是不同的。因此當我們要想jre中(如ext目錄)添加.jar文件時就要注意其匹配問題了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章