可能有很多學習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中,幾乎萬物皆對象,就連一些基礎資料型別 (Elementary Data Type),如整型、字元型、浮點型等,在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可以支援新的、自訂的傳輸協議,編寫內容控制代碼,可以支援新的資料類型。