JVM學習之JVM基礎知識




1、Java技術體系

一、Java體系構成

1)Java程序語言java

2)Java虛擬機c++

3)字節碼文件架構

4)Java類庫jvm

5)第三方Java類庫設計

二、JDK、JRE、JVM之間的關係

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

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

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.ip

(2)中文解釋

Java虛擬機是一個抽象的計算機(本質上就是可運行程序)。它和真實的計算機類似,具備指令集且可以在運行時對內存區域進行操做。Java虛擬機並不能直接解釋Java語言,它只可以解釋特定的二進制格式,即.class文件(字節碼文件)。內存



JVM結構

HotSpotJVMArchitecture1



Java代碼執行流程

Java代碼執行流程1



JVM架構模型

一、指令架構

(1)基於棧式架構

​ a)設計和實現更簡單

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

​ c)不須要硬件支持,可移植性更好,更容易實現跨平臺

(2)基於寄存器架構

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

​ b)執行效率高

二、例子

(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

三、思考

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

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

相關文章
相關標籤/搜索