JVM學習之Java技術體系

一、Java技術體系

1、Java體系構成

1)Java程式語言

2)Java虛擬機

3)位元組碼文件

4)Java類庫

5)第三方Java類庫

2、JDK、JRE、JVM之前的關係

1)JDK:Java程式語言、Java虛擬機和Java類庫統稱為JDK(Java Development Kit)

2)JRE:Java類庫中的Java SE和Java虛擬機統稱為JDR(Java Runtime Enviroment)

JDK、JRE、JVM關係圖

JVM介紹

(1)JVM官方文檔定義

The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction set and manipulates various memory areas at run time. It is reasonably common to implement a programming language using a virtual machine; the best-known virtual machine may be the P-Code machine of UCSD Pascal.

The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the classfile format. Aclass file contains Java Virtual Machine instructions (or *bytecodes*) and a symbol table, as well as other ancillary information.

(2)中文解釋

Java虛擬機是一個抽象的電腦(本質上就是可運行程式)。它和真實的電腦相似,具有指令集且能夠在運行時對記憶體區域進行操作。Java虛擬機並不能直接解釋Java語言,它只能夠解釋特定的二進位格式,即.class文件(位元組碼文件)。

JVM結構

HotSpotJVMArchitecture1

Java程式碼執行流程

Java程式碼執行流程1

JVM架構模型

1、指令架構

(1)基於棧式架構

​ a)設計和實現更簡單

​ b)指令集小,編譯器易實現

​ c)不需要硬體支援,可移植性更好,更容易實現跨平台

(2)基於暫存器架構

​ a)依賴硬體,可移植性查

​ b)執行效率高

2、例子

(1)Java源碼

public class StackTest {

    public static void main(String[] args) {
        int a = 2;
        int b = 3;
        int c = a + b;
    }
}

(2)C++源碼

void test() {
    int a = 2;
    int b = 3;
    int c = a + b;
}

(3)基於棧式結構計算過程


使用jclasslib查看位元組碼

jclasslib查看位元組碼1

0 iconst_2    常量為2
1 istore_1    將常量2保存至索引為1的操作數棧中
2 iconst_3    常量為3
3 istore_2    將常量2保存至索引為2的操作數棧中
4 iload_1     載入操作數棧索引為1所對應的值
5 iload_2     載入操作數棧索引為2所對應的值
6 iadd        相加
7 istore_3    將相加結果保存至索引為3的操作數棧中
8 return      

(4)基於暫存器結構計算過程

Android studio編寫完後使用ida查看指令,ARM32下的彙編指令

基於暫存器架構指令

SUB             SP, SP, #0xC
MOVS            R0, #2                      操作數2移動至R0暫存器 
STR             R0, [SP,#0xC+var_4]         R0暫存器的值寫入[SP,#0xC+var_4]地址
MOVS            R0, #3                      操作數3移動至R0暫存器 
STR             R0, [SP,#0xC+var_8]         R0暫存器的值寫入[SP,#0xC+var_8]地址
LDR             R0, [SP,#0xC+var_4]         [SP,#0xC+var_4]的值讀入R0暫存器
LDR             R1, [SP,#0xC+var_8]         [SP,#0xC+var_8]的值讀入R1暫存器
ADD             R0, R1                      R0, R1暫存器相加,結果放置R0暫存器
STR             R0, [SP,#0xC+var_C]         R0暫存器的值寫入[SP,#0xC+var_C]地址
ADD             SP, SP, #0xC
BX              LR

3、思考

網上常有結論,在完成相同操作的情況下,基於棧式架構比基於暫存器架構的指令路量要多。這種說法嚴謹嗎?

可以從上面例子中,可以看出ARM32下的基於暫存器架構的指令數量並不比基於棧式結構的指令數量少。很多人只討論了x86架構下的指令數量,而忽略了ARM架構下的指令集數量。

Tags: