為了實現java程序的可移植性,java語言對這種模式進行了改進,在機器和編譯程序之間增加了一層抽象的虛擬機器,稱之為java虛擬機。這樣,java編譯器沒有將程序直接編譯為某一種特定計算機的機器語言,而是編譯成字節碼。字節碼是一種針對JVM的機器語言,由于JVM類似于典型的計算機,因此字節碼可以很容易地被解釋成為特定的計算機機器語言,執行這種解釋工作的程序被稱為解釋器。解釋器對字節碼指令是翻譯一條,執行一條,而不是一次性翻譯所有的字節碼程序。那么,這就意味這,字節碼程序可以通過internet傳送到另外一臺計算機上方便地運行。這正是網絡編程的原因之一。
Java程序與編譯運行環境的相互關系。
JVM在任何平臺上都提供給編譯程序一個共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然后由解釋器來將虛擬機代碼轉化為特定系統的機器碼執行。
在java中提供給虛擬機理解的字節碼不面向任何特定到底處理器,只面向虛擬機。從結構上看JVM與實際的計算機相似,由一組抽象的部件組成,包括指令集、寄存器組、類文件格式規定、堆棧、內存垃圾收集器和存儲區6個部分。其中,指令集采用與平臺無關的字節碼形式,寄存器組中包含程序計數器、堆棧指針、運行環境指針和變量指針,類文件也與平臺無關,堆棧指針用來傳遞參數和返回運行環境,垃圾收集處理器不再使用內存片段,存儲區則用來存放字節碼。JVM僅僅規定了部件的功能和規格,雖然這些功能也是統一的,但是沒有規定部件具體的實現技術。