1. 程式人生 > >Java體系結構介紹

Java體系結構介紹

CA 但是 volcano 訪問控制 開發 kit 很好 優化 特性

Java技術的核心就是Java虛擬機——所有Java程序都在其上運行,需要Java虛擬機、Java API和Java,class文件的配合,Java程序才能夠運行 為什麽使用Java 通過網絡連接起來的智能設備和計算機組成的基礎結構開創了軟件的新環境,它為軟件開發者帶來了新的挑戰和機遇。Java可以很好地幫助軟件開發者面對挑戰,抓住挑戰。因為Java是為網絡而設計得。Java的這種適合網絡環境的能力是由其體系結構決定的,它可以保證安全的、健壯的且平臺無關的程序通過網絡傳播,在很多不同的計算機和設備上運行。 網絡帶來的挑戰和機遇 平臺無關性:軟件開發者面對的挑戰之一是這種逐漸增長的以網絡為核心的硬件環境,其包含的設備越來越廣泛。一般網絡都有很多不同的設備、不同的硬件體系、不同的操作環境,用於不同的用途。Java通過創建與平臺無關的程序來解決這個問題。和一個特定的系統以及操作環境編譯的程序比起來,用Java編寫的平臺無關的程序會更容易編寫、管理和維護,代價也更低 安全性:Java體系結構對程序健壯性有一定的保證,一些有害代碼不會在Java代碼中出現,比如:內存泄漏。Java先天上防止了很多bug的出現,所以它還帶來和網絡無關的另一個好處:提高程序員的生產力 網絡移動性:運動對象——它同時在2網絡上傳遞代碼和狀態,Java實現了對象移動的諾言——通過它的對象序列化API和RMI(遠程調用方法),對象在網絡化的運動型分布式系統編程創造了新模型,有效地把面向對象編程的優點帶到了網絡上 體系結構 Java體系結構包括四個獨立但相關的技術:
  • Java程序設計語言
  • Java.class文件格式
  • Java應用編程接口(API)
  • Java虛擬機
四者關系如下: 當編寫並運行一個Java程序時,就同時體驗了這四種技術,用Java編程語言編寫源代碼,把它編譯成Java.class文件,然後再在Java虛擬機中運行class文件,當編寫程序時通過調用類(這些類實現了Java API)中的方法來訪問系統資源(比如I/O)。當程序運行的時候,它通過調用class文件實現了Java API的方法來滿足程序的Java API調用 Java虛擬機 Java的面向網絡的核心就是Java虛擬機,它支持Java面向體系結構三大支柱的所有方面:平臺無關性、安全性和網絡移動性。 Java虛擬機的主要任務是裝載class文件並且執行其中的字節碼。 1、不同的Java虛擬機中執行引擎不同:
  • 在由軟件實現的虛擬機中,最簡單的執行引擎就是一次性解釋字節碼;
  • 另一種引擎更快,但是也消耗內存,叫做“即時編譯器”,這種情況下,第一次被執行的字節碼會被編譯成本的機器代碼,編譯出的本地機器會被緩存,當方法以後被調用的時候可以重用;
  • 第三種引擎是自適應優化器,在這種方法裏,虛擬機開始的時候解釋字節碼,但是會監視運行中程序的活動,並且記錄下使用最頻繁的代碼段。
當Java虛擬機是由主機操作系統上的軟件實現的時候,Java程序通過調用本地方法(native method)和主機交互。 2、Java中有兩種方法:Java方法和本地方法
  • Java方法使用Java語言編寫,編譯成字節碼文件,存儲在.class文件中的
  • 本地方法是由其他語言(比如C,C++,或者匯編語言)編寫的,編譯成和處理器相關的機器代碼
區別:本地方法保存在動態鏈接庫中,格式是各個平臺專有的。Java方法是與平臺無關的,運行中的Java程序調用本地方法時,虛擬機裝載包含這個本地方法的動態庫並調用這個方法 本地方法的作用:使用本地方法還可能把程序變得和特定的Java平臺實現相關。一個本地方法接口——Java本地接口——使得本地方法可以在特定主機系統的任何一個Java平臺實現上運行 如果希望保證程序的平臺無關性,那只能通過Java API來訪問底層系統資源 類裝載器的體系結構 Java虛擬機中存在著多個類裝載器,因而結構圖中的類裝載器方塊實際上表示的是一個可能包含多個類裝載器的子系統,類裝載器的體系結構是Java虛擬機在安全性和網絡移動性上發揮重要作用的一個方面。 兩個裝載器:
  • 啟動類裝載器是Java虛擬機實現的一部分
例如:如果Java虛擬機在已有操作系統上實現為C程序,那麽啟動類裝載器就會是此C程序的一個部分,啟動類裝載器通常使用某種默認方式從本地磁盤中裝載類,包括Java API的類(啟動裝載器也稱為原始類裝載器、系統類裝載器或者默認類裝載器)
  • Java應用程序能夠在運行時安裝用戶定義的類裝載器,這是以自定義方式裝載類
例如:從網絡下載class文件,盡管啟動類裝載器是虛擬機實現的本質部分,而用戶定義的類裝載器不是;但用戶定義的類裝載器能夠用Java編寫,能夠被編譯為class文件,能夠被虛擬機裝載,還能夠像其它對象一樣實例化 每一個類被裝載的時候,Java 虛擬機都監視著這個類,看它到底是被啟動類裝載器還是被用戶類裝載器裝載,當被裝載的類引用了另一個類時,虛擬機就會使用裝載第一個類的類裝載器裝載被引用的類 例如:如果虛擬機使用一個特定的類裝載器裝載Volcano這個類,它就會使用這個類裝載器裝載Volcano類使用的所有類。如果Volcano的同一個使用了一個叫做Lava的類,比方說,可能是調用了Lava類的一個方法,那麽虛擬機將會使用裝載Volcano的同一個類裝載器裝載Lava,這樣,被這個類裝載器返回的Lava類就動態與Volcano類建立起了聯系 Java.class文件 Java.class文件主要在平臺無關性和網絡移動性方面使Java更適應於網絡。 在平臺無關性方面的主要任務是:為Java程序提供獨立底層主機的二進制形式的服務,Java.class文件是可運行在任何支持Java虛擬機的硬件硬件平臺和操作系統上的二進制文件 在網絡移動性的主要任務是:首先.class文件設計緊湊,有助於在快速在網上傳送,其次,由於Java程序是動態連接和動態擴展的,.class文件可以在需要的時候才下載,可以最大限度的減少終端用戶的等待時間 Java API Java API是運行庫的集合,它提供一套訪問主機系統資源的標準方法。編寫Java程序時,可以假設在任何可運行程序的Java虛擬機上都能夠獲取Java API .class文件,所有被裝載的class文件(包括從應用程序和從Java API中提取的)和所有已經裝載的動態庫(包含本地方法)共同組成了在Java虛擬機上運行的整個程序。 Java API的class文件天生就與主機平臺密切相關,而Java API的內部設計也和平臺無關性相關 例如:Java API的用戶圖形界面庫——即AWT(Abstract Windows Toolkit,抽象窗口工具箱)和Swing的設計目的是使用戶設計的界面能夠在所有平臺上運行。由於不同平臺上用戶界面的外觀風格具有相當大的差異,創建平臺無關的用戶界面是一件很困難的。AWT類庫體系結構並沒有強制Java API把所有平臺上的Java程序用戶界面都做成一個模式。恰恰相反,AWT類庫體系結構鼓勵在外觀風格上適應於相應的底層平臺。Swing類庫甚至提供了更加靈活的方式:允許程序員自己選擇外觀風格。而且由於平臺與平臺之間字體大小、按鈕和其他用戶界面控件存在相當大的差異,AWT和Swing都包含了運行時定位窗體或對話框成員的布局管理器,布局管理器在不同平臺上采用了些許不同的方式來定位對話框控件。除此之外,還有一些方面,Java API的內部系統結構把推動Java程序平臺無關性的發展作為一個設計目的 Java API在Java安全模型方面做出了貢獻:通過強制執行安全管理器和訪問控制器建立的安全環境的建立,在這種安全環境中,可以運行具有潛在危險的代碼 Java程序設計語言 Java技術非常適用於網絡,但Java程序設計語言是相當通用的。使用Java語言編寫程序,能夠充分利用如下的許多軟件技術:
  • 面向對象
  • 多線程
  • 結構化錯誤處理
  • 垃圾收集
  • 動態連接
  • 動態擴展
使用Java語言最引人註目的原因之一是:他能夠提高開發者的效率;而它最主要的缺點在於執行速度較慢 Java是一門面向對象語言。面向對象技術的承諾之一是提升代碼的重用率,提高開發者的效率。與C++不同,在Java中沒有通過使用強制轉換指針類型或者通過進行指針運算直接訪問內存的方法。在Java中使用對象時,需要嚴格地遵守類型規則 Java避免無意破壞內存的另一個方法是自動垃圾收集。Java和C++一樣,有一個new操作符,可以通過它來為新對象在堆中分配內存。但是和C++不一樣的是,Java並沒有與new相對應的delete操作符,C++程序員常常使用delete來清除程序中不再需要的對象;而Java中只需要停止對一個對象的使用,一段時間後,垃圾收集器會自動回收這個對象所占據的內存 Java在運行時保護內存完整性的第三個辦法是數組邊界檢查。在C++中數組操作實際上就是指針運算,這會帶來潛在的內存沖突。在Java中數組是發展完備的對象,在每次使用數組的時候,Java都會檢查數組邊界,Java絕對不允許數組操作超出邊界,從而導致內存沖突 最後一個關於Java確保程序健壯性的例子是對對象引用的檢查,每次使用的時候,Java都會確保這些引用不為空值。在C++中,使用一個空指針通常會導致程序崩潰。在Java中,使用一個空的引用會導致一個異常被拋出。 使用Java語言能夠提高生產效率,效率提升就帶來了開發周期的縮短和開發費用的降低。如果利用到Java程序潛在的平臺無關性,就會使費用進一步降低 Java體系結構的代價 和其他技術(諸如C++)相比·,Java程序中的執行速度可能比較低,這是Java在面向對象網絡特性上所付出的最主要的代價之一。 第一個Java虛擬機誕生於1995年,它可以在一個解釋器上執行字節碼,這是一項較為簡單的技術,性能不高。不久,它的編譯器誕生了。和解釋器相比,它極大的提高了Java的性能。隨著最近虛擬機技術的發展,即使不能說Java速度上的缺陷完全消失了,但也有顯著的改善。適應性優化等先進技術使Java程序能夠以和本地編譯的C程序相媲美的速度運行 Java開發者所面對的困難一是:即使特定的Java虛擬機能夠提供相當好的性能,但一般情況下,開發者無法選擇他們的程序將會在哪一種Java虛擬機上運行 Java是一個非常靈活的工具,它提供許多方法去解決潛在的性能問題,例如:如果需要提供的僅僅是一個單獨的可執行文件,就可以:
  • 隨程序附帶一種虛擬機
  • 把程序中對時間要求嚴格的部分作為本地方法實現
  • 把整個程序編譯成一個單獨的可執行文件,就像C和C++一樣
把Java程序編譯成單獨的可執行程序的方法能夠改善性能,但這通常是以犧牲Java的動態擴展能力為代價的,然而,當開發的不是一個單獨的應用程序,而是一個分布式系統,特別是代碼和對象需要在虛擬機之間移動的時候,性能管理就會變得十分困難 雖然使用Java時,程序的速度是令人擔憂的事情,但是還是有很多方法可以彌補這一點。通過適當使用開發、發布和執行Java程序的各種技巧,大多數情況下還是能夠取得令終端用戶滿意的速度,只要能夠成功的解決速度問題,就能夠使用Java語言並認識到它的益處——提高開發者的效率,為終端用戶增強程序的健壯性。 困難二:在內存管理和線程調度上的缺陷 垃圾收集器可以使得許多程序更加健壯,這也是網絡中很有價值的安全性保障措施。但是垃圾收集器也給程序運行時的性能加入了一些不確定性,你無法確認垃圾收集器什麽開始收集垃圾,無法確認垃圾收集器是否開始收集垃圾,也無法確認垃圾收集到底要持續多長時間。 困難三:為實現平臺無關性,出現了最小公分母問題 這是在任何嘗試提供跨平臺功能的API上都會出現的固有困難,最小公分母問題不僅折磨平臺無關性API的設計者,而且還影響到了使用這種API的程序的開發者 困難四:當Java.class文件與Java編程語言之間緊密聯系和Java天生的動態連接特性聯系到一起的時候,還要付出一個代價,因為Java程序是多態連接的,從一個類到另一個類的引用是符號化的。Java.class文件不僅僅包含對其他類字段和成員方法的符號引用,他還包含對自己的字段和成員方法的符號引用。將Java.class文件逆向編譯為Java源碼文件相當容易,但逆向編譯靜態連接的二進制可執行文件是相當困難的,這並不僅僅因為缺失了符號信息(最初的類、字段、方法和局部變量名),還因為通常靜態連接庫的優化程度非常高。而靜態連接二進制文件優化程度越高,它的初始源代碼的符合程度就越小 結論 Java能在極大程度上提高程序員得到效率,增強程序耳朵健壯性,與老的程序設計技術(如C和C++)相比,具有過的去的性能,為新興的以網絡為中心的計算提供了一種工具

Java體系結構介紹