Java虚拟机之JVM基础知识
一、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关系图](https://gitee.com/leeboyce/imagebed/raw/20200305-image/uPic/JDK、JRE、JVM关系图.png)
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](https://gitee.com/leeboyce/imagebed/raw/20200305-image/uPic/HotSpotJVMArchitecture1.png)
Java代码执行流程
![Java代码执行流程1](https://gitee.com/leeboyce/imagebed/raw/20200305-image/uPic/Java代码执行流程1.png)
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](https://gitee.com/leeboyce/imagebed/raw/20200305-image/uPic/jclasslib查看字节码1.png)
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](https://gitee.com/leeboyce/imagebed/raw/20200305-image/uPic/基于寄存器架构指令1.png)
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架构下的指令集数量。