java體系結構介紹

1、JAVA體系結構說明
     java體系結構包括四個獨立相關的技術: java程序設計語言、 java class 文件格式、java應用編程接口、 java虛擬機。
     當編寫並運行一個java程序時,就同時使用了這四種技術。用java編寫源代碼,把它編譯成java class文件,然後在java虛擬機中運行class文件。當編寫程序時,通過調用類中的方法來訪問系統中資源如io、網絡內存等。當程序運行的時候它可以調用class文件中的實現的方法來滿足程序java api的調用。

     如圖

    


     
2、JAVA虛擬機結構
     java面向web(網絡)編程的核心就是java虛擬機、它堅持java面向網絡體系結構三大支柱的所有方面平臺無關性安全性網絡移動性。
     java虛擬機是一臺可以比作是一臺抽象的計算器,其java api規範定義了每個java虛擬機都必須實現的特性,但是爲每個特性實現都留下了很多選擇。 舉個例子說:雖然每個java虛擬機都必須能夠執行java字節碼,但是用何種技術來執行是可以選擇的,比如現在使用的就是c++和c的結合。
     java虛擬機的主要任務是裝載class文件並且執行其中的字節碼如圖:
       
      java虛擬機中包含一個類裝載器也就是經常說到的class loader ,它可以從程序和API裝載class文件。javaAPI中只有程序執行時需要的那些類纔會被裝載。字節碼是由執行引擎來執行的。
      不同的java虛擬機中,執行引擎可能實現的非常不同。在由java實現的虛擬機中有三種執行引擎:一種叫“一次性解釋字節碼”、二種叫“即時編譯器”英文just-in-time compile、三種叫“自適應優化器”。第二種比第一種執行引擎效率上要高很多,執行速度也更快,但相對的缺點就是內存消耗很大。當內存消耗劇烈的時候,jvm就會出現異常。
     在這種情況下,即時編譯器第一次被執行的字節碼會被編譯成本地機器代碼,編譯出的本地機器代碼也會被緩存,當方法以後被調用時候可以重用。
     第三種引擎,自適應優化器,在這種方法裏,虛擬機開始的時候解釋字節碼,但是會監視運行種的程序的活動,並且記錄下使用最頻繁的代碼段。程序運行時,虛擬機只把那些活動最頻繁的代碼編譯成本地代碼,其他代碼由於使用的並不很頻繁,繼續保留字節碼由虛擬機繼續即時它們。一個自適應的優化器可以使用java虛擬機種的80%-90%的時間裏執行被優化的本地代碼,而只需要編譯10%-20%對性能有影響的代碼。
     最後一種虛擬機由硬件芯片構成,它本地方法執行java字節碼,這種執行引擎實際上是內嵌在芯片裏的。
     有時間java虛擬機被稱爲java解釋器。然而,考慮到執行字節碼的方式可能不同的這個稱謂可能會存在誤導,雖然對於直接解釋字節碼的java虛擬機來說,java解釋器是一個合理的名字。但是討論執行技術時,解釋是一種我們所知道的易於實現而執行緩慢的特殊技術。因此解釋器只標示是java虛擬機,並不能代表任何含義。
     當java虛擬機是由主機操作系統上的軟件實現的時候,java程序通過調用本地方法native mehod 和主機進行交互。java中有兩種方法,java方法和本地方法。java方法是由java語言編寫,之後編譯成字節碼,存儲在class文件中的。本地方法是由其他語言比如c\c++\彙編語言編寫的,編譯器和處理器的相關代碼。本地方法保存在動態鏈接庫中,格式是各個平臺專有的。java方法是與平臺無關的,本地方法卻不是。運行中的java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫,並調用這個方法。本地方法是聯繫java程序和底層主機操作系統的鏈接方法。

     如圖


    通過本地方法,java程序可以直接訪問底層操作系統的資源。如果是開發者這樣使用,就強依賴平臺了。因爲本地方法中使用的類庫都與平臺有關。一個本地平臺接口--java本地接口 java native interface .簡稱jni,使得本地方法可以在特定主機系統的任何一個java平臺上實現運行。然而java平臺的供應商並不一定必須支持jni。除了jni外。開發者還可以提供自己的本地方法接口。如果希望開發者希望使用特別主機上的資源,又無法從java api訪問,那麼就可以寫一個平臺相關的java程序來調用本地方法。如果要保證平臺無關性,那麼就只能通過java api 來訪問底層系統資源。
3、 類裝載器的體系結構
      在java虛擬機上,存在着多個類裝載器,因而結構圖中的類裝載器方法實際標示的是一個可能包含多個類裝載器的子系統。
       一個java應用程序可以使用兩種類裝載器,啓動bootstrap類裝載器和用戶定義的類裝載器。啓動類裝載器是java虛擬機實現的一部分。啓動裝載器通常使用默認的方式從本地磁盤中裝載類,包括java api類。啓動類裝載器也被叫做原始類裝載器、系統類裝載器或者默認類裝載器。
       java 應用程序能夠在運行時安裝用戶定義的類裝載器,這種類裝載器能夠使用自定義的方式類裝載類。如圖
       
     每一個類被裝載的時候,java虛擬機都要監視這個類,看它到底是被啓動裝載器還是被用戶自定義類裝載器裝載。當被裝載的類引用了另外一個類時,虛擬機就會使用裝載第一個類的類裝載器裝載被引用的類。舉例說明如果虛擬機使用一個特定的類裝載器裝載了volcano這個類,它就會使用這個類裝載器裝載volcano類使用的所有類。如使用了一個叫lava類的一個方法,那麼類裝載器將動態的建立與lava類之間的關係。
     由於虛擬機採用這種方式進行類裝載,所以被裝載的類默認情況下只能看到被同一個類裝載器裝載的別的類。通過這種方式java體系結構允許java應用程序開闢多個命名空間。運行時java應用程序中的每一個類裝載器都有它自己的命名空間。
    以上內容可以說,一個命名空間就是一個獨立的內存體,內存與內存之間是不能通信的(這即時tomcat的核心,用戶自定義的class loader,tomcat通過實現自己的class lodaer來實現不同的命名空間,裝載不同的web工程)。
     一個應用程序能夠從一個類或者多個類中實例化多個用戶定義的類裝載器,因此需要多少個用戶自定義的類裝載器,java應用程序就可以創建多少個。
4、java class 文件
     java class文件是一個可以跨平臺的二進制文件,是通過java虛擬機來實現編譯的。

5、java api
     java api是先天內嵌套在java 虛擬機平臺上的。如果java 應用程序實現代碼就必須先實現java api。 api調用方式如圖


6、java 程序語言設計
     使用java語言進行開發時,有許多的優秀的特性,它是面向對象的、支持多線程、可以結構化處理錯誤(異常處理)、支持gc(垃圾收集)、可以動態鏈接(可以通過類裝載器來裝載類與類之間的關係)、可以支持動態擴展等。
          
7、java 體系結構的缺陷
     java和其他技術相比如c++和c,java程序執行的速度可能比較低,但現在虛擬機的技術也在突破,java程序的執行效率也不見得會真的比c和c++慢多少。當然即使特定的java虛擬機能夠提供相當好的性能,但一般情況下,開發者還是無從選擇程序在那一個java虛擬機上運行。
     那麼java如何解決性能問題呢?那麼可以這樣做:隨程序附帶一種虛擬機,把程序中對時間執行嚴格的程序本地化實現,把整個程序編譯成一個單獨的執行文件,就像c和c++一樣,在安裝java虛擬機時可以把程序預先編譯成可執行文件等等方式。
     java可以把預先編譯成單獨的程序來執行,但帶來的缺點就是不能動態擴展了。預編譯是靜態鏈接而不是動態鏈接,它產生出的是一個完全鏈接的,單獨的本地可執行文件,但是這種可執行文件通常失去了運行時動態創建和鏈接新類型的能力。
     java除了性能問題以外、另一個缺陷內存管理和線程序調度上的缺陷。垃圾回收可以使得許多程序更健壯,但是垃圾回收也給程序運行時帶來了一些不確定性,因爲開發者無法確認垃圾回收器什麼時候回收垃圾,無法確認垃圾回收是否開始收集,也無法確認垃圾收集到底要持續多長時間。java虛擬機規範對線程管理非常鬆散,這就會導致開發者無法瞭解應該如何調度線程,無法控制線程調度。
    java爲了實現跨平臺,也是付出了一定代價的即“最小公分母問題”,因爲很多特性需要開發者必須去考慮和實現,甚至有些特性是必須要實現的,這些最小公分母的選擇都將會在某種程度上會對相關操作系統不友好。
   java天生就有動態鏈接特性,但這也犧牲了一部分東西,你看從一個類到另一個類的引用是符號化的,在靜態鏈接的可執行程序中,類之間的引用只是直接的指針或者偏移量。相反,在java class文件中 指向了另一個類或者類的方法、屬性都是需要通過特殊的聲明,同時java class文件又包含了很多調試信息,這些調試信息包含了局部變量的名稱和類型。這樣一個class文件、以及字節碼指令集和java語言之間的密切聯繫,都會使得java class文件逆向java源碼文件,這就使得有人竊取你的源代碼就相當容易。
     然而,有一種方法可以避免就是使用混淆器,混淆起可以對類名、參數等都混淆避免他人閱讀源碼時根據名稱瞭解作者的意圖。混淆器在國內使用非常少就不詳述了。
 
8、總結
     java 的體系結構還是非常複雜和繁多的,要想對接下來的知識進一步學習,這個還是作爲了解比較好的。。
    
     









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章