若是安裝了JDK,會發同你的電腦有兩套JRE,一套位於 \jre 另一套位於 C:\Program Files\Java\j2re1.4.1_01 目錄下,後面這套比前面那套少了Server端的Java虛擬機,不過直接將前面那套的Server端Java虛擬機複製過來就好了。並且在安裝JDK能夠選擇是否安裝這個位於 C:\Program Files\Java 目錄下的JRE。若是你只安裝JRE,而不是JDK,那麼只會在 C:\Program Files\Java 目錄下安裝惟一的一套JRE。
JRE 的地位就象一臺PC機同樣,咱們寫好的Win32應用程序須要操做系統幫咱們運行,一樣的,咱們編寫的Java程序也必需要JRE才能運行。因此當你裝完 JDK後,若是分別在硬盤上的兩個不一樣地方安裝了兩套JRE,那麼你能夠想象你的電腦有兩臺虛擬的Java PC機,都具備運行Java程序的功能。因此咱們能夠說,只要你的電腦安裝了JRE,就能夠正確運行Java應用程序。
一、爲何Sun要讓JDK安裝兩套相同的JRE?
這是由於JDK裏面有不少用Java所編寫的開發工具(如javac.exe、jar.exe等),並且都放置在 \lib\tools.jar 裏。從下面例子能夠看出,先將tools.jar更名爲tools1.jar,而後運行javac.exe,顯示以下結果:
Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac/Main
這個意思是說,你輸入javac.exe與輸入
java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main
結果是同樣的,會獲得相同的結果。從這裏咱們能夠證實javac.exe只是一個包裝器(Wrapper),而製做的目的是爲了讓開發者免於輸入太長的指命。並且能夠發現\lib目錄下的程序都很小,不大於29K,從這裏咱們能夠得出一個結論, JDK裏的工具幾乎是用Java所編寫,因此也是Java應用程序,所以要使用JDK所附的工具來開發Java程序,也必需要自行附一套JRE才行,因此位於C:\Program Files\Java目錄下的那套JRE就是用來運行通常Java程序用的。
二、若是一臺電腦安裝兩套以上的JRE,誰來決定呢?
這個重大任務就落在java.exe身上。Java.exe的工做就是找到合適的JRE來運行Java程序。 Java.exe依照底下的順序來查找JRE:本身的目錄下有沒有JRE;父目錄有沒有JRE;查詢註冊表: [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 因此java.exe的運行結果與你的電腦裏面哪一個JRE被執行有很大的關係。
三、介紹JVM JRE目錄下的Bin目錄有兩個目錄:server與client。
這就是真正的jvm.dll所在。 jvm.dll沒法單獨工做,當jvm.dll啓動後,會使用explicit的方法(就是使用Win32 API之中的LoadLibrary()與GetProcAddress()來載入輔助用的動態連接庫),而這些輔助用的動態連接庫(.dll)都必須位於jvm.dll所在目錄的父目錄之中。