2011年2月27日 星期日

Java Concept

JVM
  • 對於Java程式而言,其實它只認識一種作業系統(或說是一種機器),這個系統叫作JVM。
    • 而對於JVM而言,位元碼檔案就是它的可執行檔案!
    • 也就是副檔名為.class的檔案。
    • Java程式理想上,並不用理會真正執行於哪個平台之上,它只要知道如何執行於JVM之上就可以了,至於JVM實際上如何與底層平台作溝通,則是JVM自己的事!
  • Java編譯時,並不直接翻譯為相依於某平台的0101指令,而是翻譯為中介格式的位元碼(byte code)。
  • Java 的原始碼副檔名為*.java,經過編譯器翻譯過後,會變成*.class的位元碼。如果想要執行這個位元碼檔案,目標平台上必須安裝有JVMJava 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
降級你的類別檔案

沒有留言:

張貼留言