程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 深入Java虛擬機(2)——Java的平台無關性

深入Java虛擬機(2)——Java的平台無關性

編輯:JAVA綜合教程

深入Java虛擬機(2)——Java的平台無關性


一、平台無關性的好處

Java技術在網絡環境下非常有用,其中一個關鍵理由是,用Java創建的可執行二進制程序,能夠不加改變地運行於多個平台。

這樣的平台無關性隨之帶來許多的好處。這將極大地減輕系統管理員的工作;此外Java的平台無關性在嵌入式設備環境下也非常有用;從開發者的觀點看,Java能夠減少開發和在多個平台上部署應用程序的成本和時間。

Java的平台無關性自然不言而喻。對於我們開發者來說,可能對下面的Java是如何實現支持平台無關的方法或原理更加感興趣。

二、Java如何實現平台無關的支持

Java對平台無關性的支持,就像對安全性和網絡移動性的支持一樣,是分布在整個Java體系結構中的,所有的組成部分——語言、class文件、API以及虛擬機,都在對平台無關性的支持扮演著重要角色。

2.1、Java平台

Java平台扮演一個運行時Java程序與其下的硬件和操作系統之間的緩沖角色。Java程序被編譯為可運行於Java虛擬機中的二進制程序,並且假定Java API的class文件在運行時是可用的。接著虛擬機運行程序,那些API則給予程序訪問底層計算機資源的能力。無論Java程序被部署到何處,它只需要與Java平台交互,而不需要擔心底層的硬件和操作系統。

2.2、Java語言

Java編程語言主要通過以下方式支持Java的平台無關性:它的基本數據類型的值域和行為都是由語言自己定義的。

在像C/C++這樣的語言中,基本數據類型int的值域是由它的占位寬度決定的,而它的占位寬度則由平台決定的。而Java程序,不管其運行的平台是什麼,Java中的int都是32位二進制不罵表示的有符號整數,而float則總是遵循IEEE754浮點標准的32位浮點數。同樣,這一點在Java虛擬機內部以及class文件中都是一致的。通過確保基本數據類型在所有平台上的一致性,Java語言本身為Java程序的無平台性提供了強有力的支持。

2.3、Java class文件

Java class文件可以在任何平台上創建,也可以被任何平台的Java虛擬機裝入並運行。它的格式,包括多字節值的高位優先存放約定,都有嚴格定義,並且是與Java虛擬機所在平台無關。

2.4、可伸縮性

Java支持平台無關,一個方面就是它的可伸縮性。Java平台可以在各種各樣不同類型(從嵌入式設備到大型主機)的計算機上實現。

Sun改變過的API定義方式得到了三個基本API集合,它們表現Java平台的不同的伸縮性:

(1)企業版(J2EE),Java網路編程 主要用來寫一些動態網站
(2)標准版(J2SE),Core Java 簡稱java核心基礎 主要用來寫一些C/S架構的程序
(3)微型版(J2ME),Java移動開發 主要用來開發java手機應用

三、影響平台無關性的因素

當編寫Java程序時,平台無關性只是一個可選的性能。Java程序的平台無關程度依賴於多種因素,其中有些因素不在開發人員的控制范圍內,但大多數是由開發人員控制的。從根本上說,任何Java程序的平也台無關程度都依賴於作者怎麼編寫它。

平也台無關程度影響因素有如下幾點:

3.1、Java平台的部署

只有擁有Java平台的計算機或設備才能運行Java程序。設備運行Java程序前,需要做兩件事,首先必須將Java平台移植到對應設備上,此外,實現接口還必須安裝到對應設備上。

3.2、Java平台的版本

並非所有的標准運行時庫在每個Java平台上都是可用的。作為一名開發人員,你不可能控制Java版本的發布周期或者部署進度,但是你可以選擇自己的程序所依賴的Java平台。

3.3、本地方法

決定Java程序的平台無關程度的另一個主要因素就是你是否調用了本地方法。編寫Java程序時,必須遵守的一條最重要的原則就是:不要直接或間接調用不屬於Java API的本地方法。如果必須使用本地方法,而且要使程序可以在多種平台上運行,必須將本地方法移植到所有需要的平台上。

3.4、非標准運行庫

Java平台可以由許多開發商來實現,雖然每個開發商必須提供Java API的標准運行時庫,但是個別開發商還可能提供了另外的庫。如果開發者側重於平台無關性,那麼就必須清楚地知道所使用的那些非標准運行時庫是否調用了本地方法。如沒有調用本地方法的非標准庫不會降低程序的平台無關性。否則,會事程序和平台相關了。

3.5、對虛擬機的依賴

在編寫平台獨立的Java程序時,還必須遵從兩條原則,這兩條原則和Java虛擬機中的某些部分有關,Java虛擬機中的某些部分可以由不同的開發商用不同的方法實現。這兩條原則是:
1)不要依賴及時終結(finalization)來達到程序的正確性;
2)不要依賴線程的優先級(thread prioritization)來達到程序的正確性。

這兩條原則可以防止Java虛擬機規范中運行的垃圾收集和線程在不同的實現中的變化帶來的不利影響。

所有的Java虛擬機都必須有垃圾收集堆,但是不同的實現可能使用不同的垃圾收集技術。在Java虛擬機規范中的這個靈活性意味著,在不同的虛擬機中,一個特定的Java程序中的對象可能在不同的時間被垃圾收集。這也意味著那些在對象被釋放前由垃圾收集器運行的終結方法(finalizer),在不同的虛擬機這可能是不同的時間運行的。如果使用了一個終結方法來釋放有限的內存資源,例如文件句柄,程序就可能可以在一些虛擬機的實現上運行,而在其它實現上卻不能。在一些實現上,程序可能在垃圾收集器得到機會調用釋放資源的終結方法之前,就已經將有限的資源耗盡了。

在不同的Java虛擬機的實現中,另一個變化和線程的優先級有關。Java虛擬機規范只保證了,程序中所有擁有最高優先級的可運行線程將會得到一些CPU時間。這個規范也保證了在較高優先級的線程被阻塞時,較低優先級的線程將會運行。但是,在較高優先級的線程沒有被阻塞的情況下,並沒有禁止較低優先級的線程的運行。在某些虛擬機的實現中,即使較高優先級的線程並未被阻塞,那些較低優先級的線程也可能先得到CPU時間。如果你的程序依賴於這個行為的正確性,它將在某些虛擬機的實現上可以正常運行,而在某些實現上卻不能。為了保證多線程Java程序的平台獨立,必須依賴同步(sychronization)而不是優先級來在線程之間協調相互間的動作。

3.6、對用戶界面的依賴

在不同的Java平台的實現之間 ,另一個主要的變化就是用戶的接口:在編寫平台獨立的Java程序時,用戶界面是一個更為困難的問題。用戶必須利用這些基礎類庫建立一個接口,使許多不同平台上的用戶使用起來比較舒適,這往往不是一項簡單的工作。
雖然AWT和Swing庫使得創建運行在不同平台上的用戶界面變得比較容易,但是它們並不一定使界面設計變得方便、界面必須使不同平台上的用戶使用起來感覺到愉快。

3.7、Java平台實現中的bug

Java平台的不同實現之間還有一個變化就是bug,雖然Sun已經開發了一套全面的測試標准,Java平台實現必須通過這套標准測試。但是可能某些實現在發布的時候仍然包含bug。你只能通過測試來防止這種可能性。如果確實影響,那麼就必須試圖找到一個繞開的途徑。

3.8、測試

因為Java平台的實現之間可能存在差異,依賴某些特定平台寫的Java程序,已經在任何特定平台的實現中可能存在的bug。所以應該盡可能在所有希望運行的平台上對Java程序進行測試。在實際情況中,在程序要運行的不同主機和不同Java平台實現上測試你的Java程序,是程序平台無關性的一個關鍵因素。

除了上面的內容外,《深入Java虛擬機 第二版》中,關於平台無關內容還有:平台無關的七個步驟、平台無關性的策略、平台無關性和網絡移動對象

對於博主目前而言,了解Java如何實現平台無關的支持和影響平台無關性的因素的內容就足夠了。如果需要猿友們可以下載《深入Java虛擬機 第二版》自行學習了解。

參考書籍:《深入Java虛擬機 第二版》

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved