1、JVM跨語言的平臺
隨著java7的正式釋出,java虛擬機器的設計者們通過JSR-292規範基本實現在java虛擬機器平臺上執行非java語言編寫的程式。
java虛擬機器根本不關心執行在其內部的程式到底是使用何種語言編寫的,它只關心“位元組碼”檔案。也就是說java虛擬機器擁有語言無關性,並不會單純地與java語言“終身繫結”。
只要其他程式語言的編譯結果滿足幷包含java虛擬機器的內部指令集,符號表以及其他的輔助資訊,它就是一個有效的位元組碼檔案,就能夠被虛擬機器所識別並轉載執行。
1.1 java虛擬機器
虛擬機器是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。Java虛擬機器有自己完善的硬體架構,如處理器、堆疊、暫存器等,還具有相應的指令系統。
Java虛擬機器遮蔽了與具體作業系統平臺相關的資訊,使得Java程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。
簡單來說JVM是用來解析和執行Java程式的。
Java語言的一個非常重要的特點就是與平臺的無關性。而使用Java虛擬機器是實現這一特點的關鍵。一般的高階語言如果要在不同的平臺上執行,至少需要編譯成不同的目的碼。
而引入Java語言虛擬機器後,Java語言在不同平臺上執行時不需要重新編譯。
Java語言使用Java虛擬機器遮蔽了與具體平臺相關的資訊,使得Java語言編譯程式只需生成在Java虛擬機器上執行的目的碼(位元組碼),就可以在多種平臺上不加修改地執行。
Java虛擬機器在執行位元組碼時,把位元組碼解釋成具體平臺上的機器指令執行。這就是Java的能夠**“一次編譯,到處執行”**的原因。
1.2 位元組碼
我們平時說的java位元組碼,指的是用java語言編譯成的位元組碼。準確的說任何能在jvm平臺上執行的位元組碼格式都是一樣的。所以應該統稱為:jvm位元組碼。
不同的編譯器,可以編譯出相同的位元組碼檔案,位元組碼檔案也可以在不同的jvm上執行
java虛擬機器與java語言並沒有必然的關係,它只與特定的二進位制檔案格式—Class檔案格式所關聯,Class檔案中包含了java虛擬機器指令集(或者稱為位元組碼)和符號表,還有一些輔助資訊。
1.3 虛擬機器
所謂的虛擬機器,就是一臺虛擬的計算機,它是一款軟體,用來執行一系列虛擬計算機指令。大體上,虛擬機器可以分為系統虛擬機器和程式虛擬機器。
- 大名鼎鼎的Visual Box,VMware就屬於系統虛擬機器,它們完全是對物理計算機的模擬,提供了一個可執行完整作業系統的軟體平臺。
- 程式虛擬機器的典型代表就是java虛擬機器,它專門為執行單個計算機程式而設計,在java虛擬機器中執行的指令我們稱為java位元組碼指令。
無論是系統虛擬機器還是程式虛擬機器,在上面執行的軟體都被限制於虛擬機器提供的資源中。
1.4 JVM的位置
JVM是執行在作業系統之上的,它與硬體沒有直接的互動。
1.5 JVM的整體結構
HotSpot VM是目前市面上高效能虛擬機器的代表作之一。
它採用直譯器與即時編譯器並存的架構。
1.6 Java程式碼的執行流程
1.7 JVM的架構模型
java編譯器輸入的指令流基本上是一種基於棧的指令集架構,另外一種指令集架構則是基於暫存器的指令集架構。
這兩種架構之間的區別:
基於棧式架構的特點:
設計和實現更簡單,適用於資源受限的系統。
避開了暫存器的分配難題,使用零地址指令方式分配。(一直使用的是棧頂的元素進行操作,所以始終是零地址分配)
指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧。指令集更小,編譯器容易實現。
不需要硬體支援,可移植性更好,更好實現跨平臺。
基於暫存器架構的特點:
典型的應用是x86的二進位制指令集,比如傳統的PC以及Android的Davlik虛擬機器。
指令集架構則完全依賴硬體,可移植性差。
效能優秀和執行更高效。
花費更小的指令去完成一項操作。
在大部分的情況下,基於暫存器架構的指令集往往都以一地址指令,二地址指令和三地址指令為主,而基於棧式架構的指令集確實以零地址指令位置。
總結:
由於跨平臺性的設計,java的指令都是根據棧來設計的。不同平臺CPU架構不同,所以不能設計為基於暫存器的。
優點是跨平臺,指令集小,編譯器容易實現,缺點是效能下降,實現同樣的功能需要更多的指令。
1.8 JVM的生命週期
虛擬機器的啟動
java虛擬機器的啟動是通過引導類載入器(bootstrap class loader)建立一個初始類來完成的,這個類是由虛擬機器的集體實現指定的。
虛擬機器的執行
一個執行中的java虛擬機器有著一個清晰的任務:執行java程式
程式開始執行時它才執行,程式結束時它就停止。
執行一個所謂的java程式的時候,真真正正在執行的是一個叫做java虛擬機器的程式。
虛擬機器的退出
程式正常執行結束。
程式在執行過程中遇到了異常或錯誤而異常終止。
由於作業系統出現錯誤而導致java虛擬機器程式終止。
某執行緒呼叫Runtime類或System的exit方法,或Runtime類的halt方法,並且java安全管理器也允許這次exit或halt操作。
除此之外,JNI規範描述了用JNI Invocation API來載入或解除安裝java虛擬機器時,java虛擬機器的退出情況。
1.9 JVM發展歷程
後面會陸續釋出關於JVM知識體系,本文根據<尚矽谷>教學資源所整理。