JVM學習之JVM基礎知識

碼頭工人發表於2020-11-23




一、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 class file format. A class 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下的彙編指令

基於暫存器架構指令1
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架構下的指令集數量。



相關文章