?? javadegongzuoyuanli.txt
字號:
java的工作原理
地址: http://studyroom.ccut.cn/article.php/146
java虛擬機
java虛擬機是軟件模擬的計算機,可以在任何處理器上(無論是在計算機中還是在其它電子設備中)安全并且兼容的執行保存在.class文件中的字節碼。java虛擬機的"機器碼"保存在.class文件中,有時也可以稱之為字節碼文件。java程序的跨平臺主要是指字節碼文件可以在任何具有java虛擬機的計算機或者電子設備上運行,java虛擬機中的java解釋器負責將字節碼文件解釋成為特定的機器碼進行運行。java源程序需要通過編譯器編譯成為.class文件(字節碼文件),java程序的編譯和執行過程如動畫所示。
但是,java虛擬機的建立需要針對不同的軟硬件平臺做專門的實現,既要考慮處理器的型號,也要考慮操作系統的種類。如下圖所示,目前在SPARC結構、X86結構、MIPS和PPC等嵌入式處理芯片上、在UNIX、Linux、windows和部分實時操作系統上都有java虛擬機的實現。
無用內存自動回收機制
在程序的執行過程中,部分內存在使用過后就處于廢棄狀態,如果不及時進行無用內存的回收,就會導致內存泄漏,進而導致系統崩潰。在C++語言中是由程序員進行內存回收的,程序員需要在編寫程序的時候把不再使用的對象內存釋放掉;但是這種人為的管理內存釋放的方法卻往往由于程序員的疏忽而致使內存無法回收,同時也增加了程序員的工作量。而在java運行環境中,始終存在著一個系統級的線程,專門跟蹤內存的使用情況,定期檢測出不再使用的內存,并進行自動回收,避免了內存的泄露,也減輕了程序員的工作量。
代碼安全性檢查機制
安全和方便總是相對矛盾的。java編程語言的出現使得客戶端機器可以方便的從網絡上下載java程序到本機上運行,但是如何保證該java程序不攜帶病毒或者不懷有其它險惡目的呢?如果java語言不能保證執行的安全性,那么它就不可能存活到今天。雖然有時候少數程序員會抱怨說applet連文件系統也不能訪問,但是正是各種安全措施的實行才確保了java語言的生存。
--------------------------------------------------------------------------------
字節碼的執行需要經過三個步驟,首先由類裝載器(class loader)負責把類文件(.class文件)加載到java虛擬機中,在此過程需要檢驗該類文件是否符合類文件規范;其次字節碼校驗器(bytecode verifier)檢查該類文件的代碼中是否存在著某些非法操作,例如applet程序中寫本機文件系統的操作;如果字節碼校驗器檢驗通過,由java解釋器負責把該類文件解釋成為機器碼進行執行。java虛擬機采用的是"沙箱"運行模式,即把java程序的代碼和數據都限制在一定內存空間里執行,不允許程序訪問該內存空間外的內存,如果是applet程序,還不允許訪問客戶端機器的文件系統。
Java語言的特點
1. 簡單、面向對象和為人所熟悉
java的簡單首先體現在精簡的系統上,力圖用最小的系統實現足夠多的功能;對硬件的要求不高,在小型的計算機上便可以良好的運行。和所有的新一代的程序設計語言一樣,java也采用了面向對象技術并更加徹底,所有的java程序和applet程序均是對象,封裝性實現了模塊化和信息隱藏,繼承性實現了代碼的復用,用戶可以建立自己的類庫。而且java采用的是相對簡單的面向對象技術,去掉了運算符重載、多繼承的復雜概念,而采用了單一繼承、類強制轉換、多線程、引用(非指針)等方式。無用內存自動回收機制也使得程序員不必費心管理內存,是程序設計更加簡單,同時大大減少了出錯的可能。java語言采用了C語言中的大部分語法,熟悉C語言的程序員會發現java語言在語法上與C語言極其相似。
2. 魯棒并且安全
java語言在編譯及運行程序時,都要進行嚴格的檢查。作為一種強制類型語言,java在編譯和連接時都進行大量的類型檢查,防止不匹配問題的發生。如果引用一個非法類型、或執行一個非法類型操作,java將在解釋時指出該錯誤。在java程序中不能采用地址計算的方法通過指針訪問內存單元,大大減少了錯誤發生的可能性;而且java的數組并非用指針實現,這樣就可以在檢查中避免數組越界的發生。無用內存自動回收機制也增加了java的魯棒性。
作為網絡語言,java必須提供足夠的安全保障,并且要防止病毒的侵襲。java在運行應用程序時,嚴格檢查其訪問數據的權限,比如不允許網絡上的應用程序修改本地的數據。下載到用戶計算機中的字節代碼在其被執行前要經過一個核實工具,一旦字節代碼被核實,便由java解釋器來執行,該解釋器通過阻止對內存的直接訪問來進一步提高java的安全性。同時java極高的魯棒性也增強了java的安全性。
3. 結構中立并且可以移植
網絡上充滿了各種不同類型的機器和操作系統,為使java程序能在網絡的任何地方運行,java編譯器編譯生成了與體系結構無關的字節碼結構文件格式。任何種類的計算機,只有在其處理器和操作系統上有java運行時環境,字節碼文件就可以在該計算機上運行。即使是在單一系統的計算機上,結構中立也有非常大的作用。隨著處理器結構的不斷發展變化,程序員不得不編寫各種版本的程序以在不同的處理器上運行,這使得開發出能夠在所有平臺上工作的軟件集合是不可能的。而使用java將使同一版本的應用程序可以運行在所有的平臺上。
體系結構的中立也使得java系統具有可移植性。java運行時系統可以移植到不同的處理器和操作系統上,java的編譯器是由java語言實現的,解釋器是由java語言和標準C語言實現的,因此可以較為方便的進行移植工作。
--------------------------------------------------------------------------------
4. 高性能
雖然java是解釋執行的,但它仍然具有非常高的性能,在一些特定的CPU上,java字節碼可以快速的轉換成為機器碼進行執行。而且java字節碼格式的設計就是針對機器碼的轉換,實際轉換時相當簡便,自動的寄存器分配與編譯器對字節碼的一些優化可使之生成高質量的代碼。隨著java虛擬機的改進和"即時編譯"(just in time)技術的出現使得java的執行速度有了更大的提高。
--------------------------------------------------------------------------------
5. 解釋執行、多線程并且是動態的
如果你了解C語言和C++語言,可以參考下列java與C/C++語言的比較,如果不了解C語言和C++語言,可以忽略本部分知識。
a. 全局變量
java程序不能定義程序的全局變量,而類中的公共、靜態變量就相當于這個類的全局變量。這樣就使全局變量封裝在類中,保證了安全性,而在C/C++語言中,由于不加封裝的全局變量往往會由于使用不當而造成系統的崩潰。
b. 條件轉移指令
C/C++語言中用goto語句實現無條件跳轉,而java語言沒有goto語言,通過例外處理語句try、catch、finally來取代之,提高了程序的可讀性,也增強了程序的魯棒性。
c. 指針
指針是C/C++語言中最靈活,但也是最容易出錯的數據類型。用指針進行內存操作往往造成不可預知的錯誤,而且,通過指針對內存地址進行顯示類型轉換后,可以類的私有成員,破壞了安全性。在java中,程序員不能進行任何指針操作,同時java中的數組是通過類來實現的,很好的解決了數組越界這一C/C++語言中不做檢查的缺點。
d. 內存管理
在C語言中,程序員使用庫函數malloc()和free()來分配和釋放內存,C++語言中則是運算符new和delete。再次釋放已經釋放的內存塊或者釋放未被分配的內存塊,會造成系統的崩潰,而忘記釋放不再使用的內存塊也會逐漸耗盡系統資源。在java中,所有的數據結構都是對象,通過運算符new分配內存并得到對象的使用權。無用內存回收機制保證了系統資源的完整,避免了內存管理不周而引起的系統崩潰。
e. 數據類型的一致性
在C/C++語言中,不同的平臺上,編譯器對簡單的數據類型如int、float等分別分配不同的字節數。例如:int在IBM PC上為16位,在VAX-11上就為32位,導致了代碼數據的不可移植。在java中,對數據類型的位數分配總是固定的,而不管是在任何的計算機平臺上。因此就保證了java數據的平臺無關性和可移植性。
f. 類型轉換
在C/C++語言中,可以通過指針進行任意的類型轉換,不安全因素大大增加。而在java語言中系統要對對象的處理進行嚴格的相容性檢查,防止不安全的轉換。
g. 頭文件
在C/C++語言中使用頭文件聲明類的原型和全局變量及庫函數等,在大的系統中,維護這些頭文件是非常困難的。java不支持頭文件,類成員的類型和訪問權限都封裝在一個類中,運行時系統對訪問進行控制,防止非法的訪問。同時,java中用import語句與其它類進行通信,以便訪問其它類的對象。
h. 結構和聯合
C/C++語言中用結構和聯合來表示一定的數據結構,但是由于其成員均為公有的,安全性上存在問題。java不支持結構和聯合,通過類把數據結構及對該數據的操作都封裝在類里面。
i. 預處理
C/C++語言中有宏定義,而用宏定義實現的代碼往往影響程序的可讀性,而java不支持宏定義。
--------------------------------------------------------------------------------
5. 解釋執行、多線程并且是動態的
為易于實現跨平臺性,java設計成為解釋執行,字節碼本身包含了許多編譯時生成的信息,使連接過程更加簡單。而多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,互不干涉,不會由于某一任務處于等待狀態而影響了其它任務的執行,這樣就可以容易的實現網絡上的實時交互操作。java在執行過程中,可以動態的加載各種類庫,這一特點使之非常適合于網絡運行,同時也非常有利于軟件的開發,即使是更新類庫也不必重新編譯使用這一類庫的應用程序。
java平臺-不斷擴展的計算平臺
java不僅是編程語言,還是一個開發平臺,java技術給程序員提供了許多工具:編譯器、解釋器、文檔生成器和文件打包工具等等。同時java還是一個程序發布平臺,有兩種主要的"發布環境",首先java運行時環境(java runtime environment,簡稱JRE)包含了完整的類文件包,其次許多主要的瀏覽器都提供了java解釋器和運行時環境。目前Sun公司把java平臺劃分成J2EE、J2SE、J2ME三個平臺,針對不同的市場目標和設備進行定位。J2EE是Java2 Enterprise Edition,主要目的是為企業計算提供一個應用服務器的運行和開發平臺。J2EE本身是一個開放的標準,任何軟件廠商都可以推出自己的符合J2EE標準的產品,使用戶可以有多種選擇。IBM、Oracle、BEA、HP等29家已經推出了自己的產品,其中尤以BEA公司的weglogic產品和IBM公司的websphare最為著名。J2EE將逐步發展成為可以與微軟的.NET戰略相對抗的網絡計算平臺。J2SE是Java2 Standard Edition,主要目的是為臺式機和工作站提供一個開發和運行的平臺。我們在學習java的過程中,主要是采用J2SE來進行開發。J2ME是Java2 Micro Edition,主要是面向消費電子產品,為消費電子產品提供一個java的運行平臺,使得java程序能夠在手機、機頂盒、PDA等產品上運行。上述三個java平臺的關系如右圖所示。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -