- 對於Java程式而言,其實它只認識一種作業系統(或說是一種機器),這個系統叫作JVM。
- 而對於JVM而言,位元碼檔案就是它的可執行檔案!
- 也就是副檔名為.class的檔案。
- Java程式理想上,並不用理會真正執行於哪個平台之上,它只要知道如何執行於JVM之上就可以了,至於JVM實際上如何與底層平台作溝通,則是JVM自己的事!
- Java編譯時,並不直接翻譯為相依於某平台的0101指令,而是翻譯為中介格式的位元碼(byte code)。
- Java 的原始碼副檔名為*.java,經過編譯器翻譯過後,會變成*.class的位元碼。如果想要執行這個位元碼檔案,目標平台上必須安裝有JVM(Java Virtual Machine)。JVM會將位元碼翻譯為平台相依的語言。
- 編譯器對於每個.class檔案,都會標示主版本號與次版本號,不同的版本號,意味著這個類別檔案是不同版本的JDK編譯出來,而.class的格式可能有所不同。JVM在載入.class前,會先確認其版本號是否在可接受的範圍,否則就不會處理該.class檔案。
JRE
- Java不僅僅是個語言,更是一個標準。大廠們共同製定的API,就是所謂的標準程式庫,或叫作Java SE API。
- Java程式會引用標準程式庫,並執行在JVM這個唯一認識的系統之上,這樣才能達到跨平台的目的。標準程式庫及JVM,都包含在JRE之中。所以Java程式要能夠執行在電腦中,就必須安裝JRE。
- JRE包括:
- 部署技術
- Java SE API(也就是標準程式庫)
- JVM
- 在執行java指令時,可以附帶一個-version引數,這可以顯示所執行的JRE版本,這是確認所執行JRE版本的一個方式。
- JRE目錄中:
- lib目錄,有個rt.jar,這就是封裝為JAR檔的Java SE API,是一堆.class所組成。
- bin目錄中,
- 如果是Public JRE,則會有個client資料夾,當中會有個jvm.dll,這個就是JVM。
- 如果是JDK的Private JRE,則會發現,bin底下除了client資料夾外,還有個server資料夾,當中也有個jvm.dll。
- 預設安裝下,只有JDK附帶的JRE中的bin會有server資料夾,而Public JRE沒有。你在執行java時,無論是Private JRE或Public JRE,預設會執行的是client中的jvm.dll。
- 如果是Public JRE,嘗試執行java時指定-server,則會出現以下的錯誤:
- Error: no `server' JVM at `C:\Program Files\Java\jre6\bin\server\jvm.dll'.
- JDK中多數工具程式,本身就是用Java寫的,執行時自然就得有JRE。
- Java本身的目標之一是跨平台,其許多工具程式本身就實現了這個理念,也因為許多工具程式本身是Java所撰寫,因此JDK本身必須附帶Private JRE,如此即使在沒有另行安裝Public JRE的情況下,也可以執行JDK相關工具程式。
- client強調啟動速度,一開始不配置太大量的記憶體。
- server的話,則是會配置較大量的記憶體,因為伺服器不強制啟動速度,而強調有客戶請求時的回應速度,因此將基本需要的資源先載入記憶體,回應時就不用慢吞吞地進行載入再回應。
JDK
- 要執行java程式,只需要裝JRE就可以了。不用裝JDK,不需要編譯器之類的東西。
- Development Tools就是安裝編譯器之類的工具程式
- JDK自己本身附有一個JRE,相對於Public JRE這個名稱,JDK自己所附的JRE稱之為Private JRE,你只要有裝JDK,就一定會有Private JRE可以用。安裝Public JRE,只不過是為了方便有另一個JRE來模擬客戶端的JRE環境而已。
- JDK就包括了:
- JRE
- JRE包括了Java SE API與JVM。
- 先有原生編譯器,一開始編譯器是可能使用C寫的,而後用Java程式碼寫個編譯器,用原生編譯器來編譯Java寫的編譯器,然後就有了Java版的編譯器。
- 事實上,JDK多數的工具程式,都是使用Java語言所撰寫的。
- JDK的bin目錄中,.exe的原生可執行檔都是方便不用輸入一長串指令,以作業系統原生執行檔包裹的包裹器(Wrapper)。
- 真正的編譯器等工具程式,其實是位於JDK目錄底下lib目錄中的tools.jar。
CLASSPATH
- 執行java,其實就是啟動JVM,之後接下類別名稱,表示由JVM載入該類別的.class並執行。
- PATH:
- 實體作業系統依PATH中的路徑資訊來尋找可執行指令(對Windows就是.exe、.bat等,對Linux等就是有執行權限的檔案)。
- JVM(虛擬作業系統)依CLASSPATH中的路徑資訊來尋找可執行指令(.class檔案)。
- JVM會依路徑的順序,找尋是否有對應的類別檔案,先找到先贏,先找到先載入。如果在JVM的CLASSPATH路徑資訊中都找不到指定的類別檔案,則會出現java.lang.NoClassDefFoundError的資訊。
- JAR檔案實際上是使用ZIP格式作壓縮,當中包含一堆.class檔案。將JAR檔案當作一個特別的資料夾,在使用IDE的時候,會在IDE的專案中設定(或有時稱匯入)所謂的「程式庫」,其實就是在IDE專案環境下的CLASSPATH中設定JAR檔案的位置與名稱。
- 預設的CLASSPATH就會讀取當前目錄下的.class,但是如果你自行指定了CLASSPATH,則以你指定的為主。
- CLASSPATH的路徑設定,是給應用程式類別載入器(AppClassLoader)使用的資訊。
* Reference
- 為什麼需要 JVM?
- 什麼是 JRE?
- 來安裝 JDK
- CLASSPATH 是什麼?
- 你執行的是哪個 JRE?
- Java SE Technologies at a Glance
- 降級你的類別檔案
沒有留言:
張貼留言