JAVA虛擬機之二:Java體系結構

Java體系結構包括四個獨立但相關的技術:
  • Java程序設計語言。
  • Java class文件格式。
  • Java應用編程接口(API)。
  • Java虛擬機。
當編寫並運行一個Java程序時,就同時體驗了這四種技術。用Java編寫語言編寫源代碼,把它編譯成Java class文件,然後再在Java虛擬機中運行class文件。當編寫程序時,通過調用類(這些類實現了Java API)中的方法來訪問系統資源(如:I/O)。當程序運行的時候,它通過調用class文件中實現了Java API的方法來滿足程序的Java API調用。如下圖:

 
Java虛擬機和Java API一起組成了一個“平臺”,所有java程序都在這個上面編譯。java虛擬機和Java API的組合除了被稱爲java運行時系統之外,還稱爲Java平臺。java程序可以在不同的計算機上運行,這是因爲Java平臺自己可以用軟件實現。
 
一、java虛擬機
java虛擬機的主要任務是裝載class文件並且執行其中的字節碼,如下圖可以看到,java虛擬機包含一個類裝載器(class loader),它可以從程序和API中裝載class文件。java API中只有程序執行時需要的那些類纔會被裝載。字節碼由執行引擎來執行。

 
當Java虛擬機是由主機操作系統上的軟件實現的時候,Java程序通過調用本地方法(native method)和主機交互。Java中有兩種方法:Java方法和本地方法。Java方法是由Java語言編寫的,編譯成字節碼,存儲在class文件中的。本地方法是由其他語言(如C,C++或者彙編語言)編寫的,編譯成和處理器相關的機器代碼。本地方法保持在動態鏈接庫中,格式是各個平臺專有的。Java方法是與平臺無關的,但是本地方法是和平臺密切相關的。運行中的Java程序調用本地方法時,虛擬機加載包含這個本地方法的動態庫,並調用這個方法。在下圖中可以看到,本地方法是聯繫Java程序和底層主機操作系統的連接方法。

 
二、類加載器的體系結構
一個Java應用程序可以使用兩種類加載器:“啓動”(bootstrap)和用戶自定義類加載器。啓動類加載器是Java虛擬機實現的一部分。啓動類加載器通常使用某種默認方式從本地磁盤中加載類,包括Java API的類(啓動類加載器也稱爲原始類加載器、系統類加載器或者默認類加載器)。java應用程序能夠在運行時安裝用戶自定義的類加載器,這種類加載器能使用自定義的方式來加載類,用戶自定義類加載器使用Java編寫,能夠被編譯爲class文件,能有被虛擬機加載,還能夠像其他對象一樣實例化,是運行中的java應用程序可執行代碼的一部分。
 由於有了用戶自定義類加載器,所以不必再編譯時就知道運行中的Java應用程序中最終會加入的所有的類,這樣使得在運行時擴展Java應用程序稱爲可能。當它運行時,應用程序能夠決定需要哪些額外的類,能夠決定一個或者更多用戶自定義的類加載器來加載。由於類加載器是使用java編寫的,所以能用任何Java代碼中可以表述的風格來進行類的加載。這些類可以通過網絡下載,可以從數據庫中獲取,也可以動態生成。例如asm,cglib等都是動態生成字節碼的庫,aop、OSGI就是具體的使用。

 
三、Java class 文件
java class文件是可以允許在任何支持java虛擬機的硬件平臺和操作系統上的二進制文件,所謂“一次編譯,到處運行”,二進制文件扮演着重要角色。java編譯後生成的class文件跟具體的硬件平臺和操作系統無關,這樣二進制文件就可以在支持java虛擬機的任何平臺執行,來保證java程序跟平臺無關性。
 
四、java API
Java API是運行庫的集合,它提供一套訪問主機系統資源的標準方法。編寫Java程序時,任何時候都需要引用到java API class 文件;運行時,虛擬機加載程序class文件所使用的java API class文件;所有被加載的class文件(包括從應用程序中和從Java API 中提取的)和所有已加載的動態庫(包含本地方法)共同組成了在java虛擬機上運行的整個程序。前面說過java程序的class 文件跟平臺無關,而java API 的class文件跟平臺密切相關,在一個平臺能夠支持Java程序以前,必須在這個特定的平臺上明確地實現API的功能。爲了訪問主機上的本地資源,Java API調用了本地方法,這樣java程序就不用再調用它們了。通過這種方法,Java API class文件爲底層主機提供了具有平臺無關性的、標準接口的java程序。對java程序而言,無論平臺如何,Java API都會提供相同的表現和可預測的行爲。正式由於在每個特定的平臺上都明確地實現了Java虛擬機和Java API ,因此java程序本身就能夠成爲具有平臺無關性的程序。如下圖表示一個與平臺無關性的程序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章