【JVM】JVM和Java 體系架構
Java是一門可以跨平臺的語言,但是Java本身是不可以實現跨平臺的,需要JVM實現跨平臺。javac編譯好後的class檔案,在Windows、Linux、Mac等系統上,只要該系統安裝對應的Java虛擬機器,class檔案都可以執行。達到”一次編譯,到處執行”的效果。
一、虛擬機器介紹
1.1、虛擬機器概念
所謂虛擬機器(Virtual Machine),就是一臺虛擬的計算機。它是一款軟體,用來執行一系列虛擬計算機指令。大體上,虛擬機器可以分為系統虛擬機器和程式虛擬機器。
- 大名鼎鼎的Virtual Box,VMware就屬於系統虛擬機器,它們完全是對物理計算機的模擬,提供了一個可執行完整作業系統的軟體平臺。
- 程式虛擬機器的典型代表就是Java虛擬機器,它專門為執行單個計算機程式而設計,在Java虛擬機器中執行的指令我們稱為Java位元組碼指令。
- 無論是系統虛擬機器還是程式虛擬機器,在上面執行的軟體都被限制於虛擬機器提供的資源中。
1.2、Java 虛擬機器
-
Java虛擬機器是一臺執行Java位元組碼的虛擬計算機,它擁有獨立的執行機制,其執行的Java位元組碼也未必由Java語言編譯而成。
-
JVM平臺的各種語言可以共享Java虛擬機器帶來的跨平臺性、優秀的垃圾回器,以及可靠的即時編譯器。
-
Java技術的核心就是Java虛擬機器(JVM,Java Virtual Machine),因為所有的Java程式都執行在Java虛擬機器內部。
-
Java虛擬機器就是二進位制位元組碼的執行環境,負責裝載位元組碼到其內部,解釋/編譯為對應平臺上的機器指令執行。每一條Java指令,Java虛擬機器規範中都有詳細定義,如怎麼取運算元,怎麼處理運算元,處理結果放在哪裡。
特點:
- 一次編譯,到處執行
- 自動記憶體管理
- 自動垃圾回收功能
二、JVM 的位置
JVM是執行在作業系統之上的,它與硬體沒有直接的互動
JDK與JVM關係
三、Java 的整體結構
-
HotSpot VM是目前市面上高效能虛擬機器的代表作之一。
-
它採用直譯器與即時編譯器並存的架構。
-
在今天,Java程式的執行效能早已脫胎換骨,已經達到了可以和C/C++程式一較高下的地步。
-
執行引擎包含三部分:直譯器,即時編譯器,垃圾回收器
四、Java 程式碼執行流程
凡是能生成被Java虛擬機器所能解釋、執行的位元組碼檔案,那麼理論上我們就可以自己設計一套語言了
五、JVM 架構模型
Java編譯器輸入的指令流基本上是一種基於棧的指令集架構,另外一種指令集架構則是基於暫存器的指令集架構。
具體來說:這兩種架構之間的區別:
5.1、基於棧的指令集架構
基於棧式架構的特點:
-
設計和實現更簡單,適用於資源受限的系統;
-
避開了暫存器的分配難題:使用零地址指令方式分配
-
指令流中的指令大部分是零地址指令,其執行過程依賴於操作棧。指令集更小,編譯器容易實現
-
不需要硬體支援,可移植性更好,更好實現跨平臺
5.2、基於暫存器的指令級架構
基於暫存器架構的特點:
-
典型的應用是x86的二進位制指令集:比如傳統的PC以及Android的Davlik虛擬機器。
-
指令集架構則完全依賴硬體,與硬體的耦合度高,可移植性差
-
效能優秀和執行更高效
-
花費更少的指令去完成一項操作
-
在大部分情況下,基於暫存器架構的指令集往往都以一地址指令、二地址指令和三地址指令為主,而基於棧式架構的指令集卻是以零地址指令為主
5.3、兩種架構的舉例
示例
1 public class StackStruTest { 2 public static void main(String[] args) { 3 int i = 2; 4 int j = 3; 5 int m = i + j; 6 } 7 }
同樣執行2+3這種邏輯操作,其指令分別如下:
- 基於棧的計算流程(以Java虛擬機器為例):
1 iconst_2 //常量2入棧 2 istore_1 3 iconst_3 // 常量3入棧 4 istore_2 5 iload_1 6 iload_2 7 iadd //常量2/3出棧,執行相加 8 istore_0 // 結果5入棧