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)
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. 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結構
Java程式碼執行流程
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查看位元組碼
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架構下的指令集數量。