可能有很多學習Java的朋友還不知道Java的運行原理、Java虛擬機是怎麼工作的,本文將為你詳細講解(JVM)Java虛擬機。
在Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做字節碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機。每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成字節碼,字節碼由虛擬機解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。
可以說,Java虛擬機是Java語言的基礎。它是Java技術的重要組成部分。Java虛擬機是一個抽象的計算機,和實際的計算機一樣,它具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。Java解釋器負責將字節代碼翻譯成特定機器的機器代碼。Java是一種簡單的語言。它用到的概念不多,而且多為程序員所熟悉。如果你是一名程序員,掌握Java對你來說是易如反掌的事。即使你沒有學過任何編程語言,學習Java也要比學習C++要容易的多。
由於Java最初是為控制電子產品設計的,因此它必須簡單明了。為了保證這種簡單性,Java去掉了C++中許多復雜的、冗余的、有二義性的概念,例如操作符重載、多繼承、數據類型自動轉換等。為了將程序員從復雜的內存管理的負擔中解脫出來,同時也是為了減少錯誤,Java使用了自動內存垃圾收集機制,程序員只要在需要的時候申請即可,不需要釋放,而由Java自己來收集、釋放內存中的無用的塊。
與C++相比,Java有著更強的面向對象特性,是一種比較純粹的面向對象語言。一般我們使用的一些所謂的面向對象的編程語言,如C++,Object Pascal等,實際上都是一種混合型的語言,即在過程式的語言中加上面向對象的擴展。在Java中,幾乎萬物皆對象,就連一些基本數據類型,如整型、字符型、浮點型等,在Java中都可以作為對象處理。Java的面向對象特性幾乎可以與Smalltalk媲美,但是其適用於分布式計算環境的特性卻遠遠超過了Smalltalk。
Java是一種支持分布式操作的程序設計語言。使用Java提供的URL類,用戶可以象訪問本地文件一樣訪問網絡上的對象,使用非常方便。在客戶機/服務器的模式下,Java還可以將運算從服務器端分散到客戶端,提高系統的效率,避免了服務器的瓶頸制約。Java的網絡類庫支持分布式的編程。Socket類提供可靠的流式網絡的連接,支持TCP/IP協議。通過編寫協議句柄,程序員還可以擴充Java支持的協議集合。
Java提供非常有效的安全控制。由於Java應用於網絡程序的開發,因而安全性變的至關重要。因為Java小程序需要下載到客戶端解釋執行,所以,如果沒有安全控制,就會給一些網絡黑客以可乘之機,這對用戶來說是非常危險的。所幸的是,Java的安全機制可以有效的防止病毒程序的產生、下載程序對本地文件系統的破壞,以及網絡黑客竊取密碼和入侵。
Java是一種非常健壯的語言。因為在Java中使用了以下手段:
不支持指針。在C++程序中,指針的錯誤使用通常的程序中BUG的元凶。在Java中徹底去掉了指針,杜絕了內存的非法訪問,從而保證了程序的可靠性。
強類型語言
自動內存垃圾收集機制。Java自動收集無用的內存單元,進而防止了由於內存洩漏導致的動態內存分配問題。
完善的異常處理機制,既簡化了錯誤處理任務和恢復,也增加了程序的可讀性。
Java具有非常好的平台無關性和可移植性。因為Java最初是為對電子產品編程而設計的,所以它具有完美的平台無關性。它使用一種與平台無關的代碼──字節碼,而不是通常的特定機器上的機器碼,由平台上的Java虛擬機中的Java解釋器解釋執行。Java虛擬機是免費的,在許多平台上都有。
Java提供了良好的可移植性。使用Java作為編程語言,只要進行一次程序開發工作,所開發的程序不需要經過任何改動,便能在各種平台上運行。Java使用兩種方法使Java的應用程序不依賴與具體的系統:
采用基於國際標准的數據類型。Java的原始數據類型在任何機器上都是一樣的,例如整型總是32位,長整型總是64位等。
提供了一個用於訪問底層操作系統功能的可擴展類庫。
Java是一種高性能的語言。“魚與熊掌不可兼得”,通常,健壯性、安全性、平台無關性、可移植性等方面的提高總是要以犧牲性能為代價的。Java也不例外,Java的內存管理增加了運行時系統的復雜性,因為Java運行時系統必須內嵌一個內存管理模塊;同樣,Java程序的解釋執行的效率也要低於直接執行編譯後的源碼的效率。但是Java采用了一些很好的措施來彌補這些性能上的差距:
生成高效的字節碼。Java字節碼的設計充分考慮了性能的因素,字節碼的格式簡單,解釋器可以生成高效的機器碼。
提供了即時編譯和嵌入C代碼的可選措施。即時編譯是指在運行時把字節碼編譯成機器碼。支持多線程。Java提供了對多線程的語言級的接口,而且Java環境本身就是多線程的。
Java對多線程有良好的支持。多線程技術可以提高程序執行的並發度,提高圖形用戶界面的交互性能。Java提供了語言內置的多線程控制,簡化了多線程應用程序的開發,還支持線程的同步控制。
Java是一種動態的語言。動態特性是面向對象特性的一個延伸,它使得程序能夠適應不斷變化的執行環境。Java的動態性主要表現在以下幾個方面:
Java的類有運行時的表示,這樣,即使在運行時刻,程序也能辨別類之間的關系和類型信息,可以動態的從本地或網上把一個類鏈接到運行系統中去。
Java的類在運行過程中動態的裝載,因此,Java可以在分布式的環境中動態的維護應用程序和Java類庫之間的一致性。當類庫升級後,應用程序無需重新編譯,也一樣可以利用新類庫中新增的功能。
支持動態數據類型和動態協議。通過編寫協議句柄,Java可以支持新的、自定義的傳輸協議,編寫內容句柄,可以支持新的數據類型。