淺談Java虛擬機(轉)

        Java是爲網絡而設計的。它具有平臺無關性、安全性和網絡移動性。從Java設計的初衷就考慮的這些問題,所以它具有一部分先天的優勢。相對C/C++等早期高級語言而言。

        Java體系結構包括四個獨立但相關的技術:Java程序設計語言、Java Class文件格式、Java API、Java虛擬機。後兩者組成了Java的一個平臺,叫做Java運行時平臺。我們平時說的Java 2平臺就是指的這個。Java的可移植性,關鍵就在於它將平臺相關的部分都集中到了Java運行時平臺上,不同的操作平臺有不同的Java運行時平臺,而保證Java語言本身是標準統一的。

Java虛擬機規範並不規定具體的實現方式,它只是提出一種接口規範,勾勒出Java平臺的特性。虛擬機的運行速度、方式和效率,和規範沒有關係,跟具體的實現有很大的關係。比如虛擬機中的執行引擎,常見的是三種:一次性解釋字節碼、即時編譯器(JIT)、自適應優化器。另外,對於特定的硬件,還有硬件實現的虛擬機。

        Java虛擬機還有另外一種形式,那就是本地化方法(JNI)。本地化方法在Java標準之外又提供了對特定平臺的特定功能或者效率方面的支持。在實現上,JNI在被調用之後,將從Java虛擬機手中接手所有的控制權,包括是否把控制權返回Java虛擬機;而在安全性方面,JNI也是沒有保障的。所以可以認爲JNI的地位實質上跟Java虛擬機是一樣的。可以說,JNI就是Java虛擬機的擴展。這也是爲什麼Sun一直鼓勵純Java軟件的開發的原因之一。

        Java虛擬機的結構是由類裝載器和執行引擎兩部分組成的。而虛擬機的特性,也是由這兩個部分一起來完成的。

類裝載器是所有Java Class文件的裝載入口,所以在控制安全性的流程中,它也僅排在Class文件後面。最底層的是“啓動”(Bootstrap)類裝載器,它是Java虛擬機實現的一部分。其次是系統類裝載器,負責裝載Java API的系統級類。最後是用戶自定義的類裝載器。如果一個對象被調用,那麼它的默認類裝載器將是它的調用者的類裝載器。這樣,它和它的調用者就通過類裝載器動態的聯繫了起來。很著名的一個例子,就是Java Applet使用的類裝載器,是通過網絡來下載Class文件裝載的。

Java class文件。這是一個有統一標準的二進制文件。和其他的Java特性一樣,它的統一有賴於Java虛擬機將所有的不統一都攬在身上。可以說,Class文件的作用,就是方便快捷安全的在網絡在不同的計算機間傳遞。Java號稱的“一次編寫,到處使用”,class文件起了很重要的作用。

        Java API。這是Java提供給使用者的訪問不同主機資源的統一方法。它一定是平臺相關的,不同的平臺會有不同的Java API實現。但是他們都遵循同樣的API接口標準,保證了Java平臺的平臺無關性。除了具體實現,Java API的設計也煞費苦心,在接口一層儘量少的和平臺相關,比如AWT和SWing的設計,就在追求一種平臺的無關性,從設計到實現。另外一個例子,J2ME裏面的GCF(通用連接框架)更是這種思路淋漓盡致的體現。所有的連接方式,都統一成爲一個connect()函數和一個url地址。

Java編程語言。Java語言本身,是對過去面向過程/面向對象的編程語言的一次反省和總結。從新的起點出發,讓Java不必受限於過去的歷史,而成爲一種全新的擁有當時最新最先進技術總結和經驗總結的編程語言。.net固然強大,有MS的支撐,但是怎麼看怎麼像是MS高超的抄襲中的一件作品。現在Java平臺日趨穩定,但是Java語言卻一直在大步前進的改變着自己。

當然,我們在看到這些優點的同時,也必須看到Java提供的這些特性所固有的缺點,效率,兼容帶來的不完美在Java一路上都被指指點點。我們無法改變這些Java本身的毛病,但是卻要求我們在編寫Java程序的時候,需要比其他語言的程序員更加兼顧效率和代碼的優雅。這是一種壓力,也是一種榮幸。

Java虛擬機的平臺無關性。

首先,爲什麼要平臺無關。這是很明顯的,現在不管是計算機硬件還是操作系統軟件,甚至於家用電器軟硬件都是紛繁複雜,萬千種類的了。

所以,一個統一的開發運行平臺對於業界來說是極爲重要的事情,慶幸的是,Java的設計初衷就是在家電等移動性嵌入式設備上發揮作用。所以說跨平臺本來就是Java的基本職責。


Java體系結構對平臺無關性的支持:

Java體系結構通過很多方面提供對平臺無關性的支持。其中Java平臺是最主要的方面。Java平臺扮演了一個運行時Java程序與其下操作系統和硬件之間的緩衝角色。換個角度看,Java平臺實際上充當了一個標準的OS,只是這個OS目前看起來還過於笨重:)

Java編程語言本身對平臺無關性也提供了相應的支持,但是這是建立在Java平臺的基礎上的。對於C/C++程序員來說,最明顯的一個例子就是對基本數據類型的值域和行爲的定義上。以前我們一直強調不同的平臺,不同的機器,不同的CPU都有不同的字節長度定義,但是在Java中,已經不存在這種差別了,因爲Java語言統一了這些。至於究竟實際的硬件是怎麼工作的,對於Java程序員來說,已經不用去關心了。Java平臺已經自動的完成了這種轉換。

另外一個對平臺無關性提供支持的方面是Java的Class文件格式。它對於所有的Java虛擬機都是標準統一的,這也爲跨平臺傳遞程序代碼提供了實現。


所以,總體上來看,Java體系結構對平臺無關性的支持,主要來自於Java平臺的設計,相當於爲不同的硬件和操作系統提供了一層標準的外殼,Java體系結構將操作建立在一個虛擬的平臺上,也就達到了平臺無關的目的,雖然同時也帶來了很多的缺點。但是這種趨勢是不可阻擋的。

當然,說到平臺無關性,不可忽略的是Java不僅在計算機領域實現了跨平臺,而且在智能設備領域也實現了跨平臺。這是通過定義不同的虛擬機標準來實現的。也就是我們耳熟能詳的J2EE,J2SE,J2ME。實際上,這三個Java版本就是在不同的智能設備上的虛擬機規範。而在J2ME領域,平臺無關性體現得就更明顯了,因爲移動/嵌入式設備的廠商和標準都比計算機領域多得多,統一的難度也就大得多了。所以在J2ME領域,除了有J2ME這個大框架,還針對各個更細小的領域定義了各自的虛擬機標準,這些標準被稱作profile。


 影響平臺無關性的因素

雖然平臺無關性看起來是那麼的誘人,但是在編寫Java程序的時候,平臺無關性只是一個選項,並不是一個必選項。從根本上來說,任何Java程序的平臺無關程度都依賴於作者怎麼編寫它。

首先影響的因素是Java平臺的部署。Java平臺的平臺無關特性決定了要運行Java程序就必須要在客戶機上安裝符合客戶操作系統的Java平臺,也就是Java虛擬機。這並不是每一臺計算機每一種操作系統都能滿足的條件。但是幸運的是Java已經得到了廣泛的推廣,所以這個問題在大部分客戶那裏已經得到了解決。

第二個影響的因素是Java平臺的版本。這個問題主要集中在Java不同版本的Java API上。雖然Java平臺比較穩定,但是Java API的改動是比較頻繁的,這種改動會導致新版本的Java程序不能在舊平臺上運行,這也是開發語言的通病。

第三個因素是本地方法。當Java要用到一些操作系統平臺的特性,需要使用本地方法的時候,就會破壞平臺無關性。sun一直在大力推廣純Java程序,就是想通過程序員的努力,儘量避免使用本地方法。

第四個因素是非標準運行時庫。雖然本地方法會破壞平臺無關性,但是Java API提供的標準方法中使用的本地方法卻不在其列。在標準API之外,還有一些廠商和組織提供的非標準方法,這些方法有可能使用了本地方法,卻不是任何Java平臺都擁有的,所以對於這種非標準方法,一定要謹慎使用,如果它們使用了本地方法來實現,那麼平臺無關性就被破壞了。

第五個因素是對虛擬機的依賴。在分析Java虛擬機的時候,需要牢記的一點是,虛擬機不過是Sun提供的一個文字標準,並不是具體的實現,我們平時用的虛擬機是Sun提供的,但是這並不是標準的虛擬機實現,實際上虛擬機並沒有標準的實現,唯一的標準就是Sun給出的那份標準。所以對於虛擬機標準提供的一些特性,千萬不能作爲程序邏輯的一部分。因爲標準只是指出一定要實現這些特性,但是具體怎麼實現,是由具體的虛擬機實現決定的。一些可以舉例的特性是垃圾回收機制,線程優先級等等。它們被實現了,但是並沒有一個確定的實現方式,比如垃圾回收的時機,線程優先級高低是否一定決定了CPU時間分配的多少等等。

最後一個和平臺無關性的因素是對用戶界面的依賴。在不同的Java平臺上,要保證每個平臺的UI都讓用戶滿意是很困難的事情。所以在跨平臺設計的時候,要謹慎的設計UI的接口,以保證在每個平臺上都有令人滿意的表現。

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