栈顶缓存技术
指令集架构
常用的指令集架构有基于栈的栈式架构和基于寄存器的架构
基于栈的架构
java虚拟机使用的是基于栈式架构的,也就是所有操作数必须先入栈,然后根据指令中的操作码选择从栈顶弹出若干个元素进行计算后再将结果压入栈中。
而栈式架构使用的是零地址指令,指令更加紧凑,但是完成一项操作需要更多的入栈出栈指令,即需要更多的指令分派次数和内存读写次数,如进行一个加法运算,如果两个操作数都在本地变量中,那么一个加法操作就要有5次栈操作,分别是将两个操作数从本地变量入栈(2次入栈),再将两个操作数出栈用于加法操作(两次出栈),再将加法结果压入栈顶(1次入栈),而如果是基于寄存器的话,一般只需要将两个操作数存入寄存器进行加法运算后再将结果存入其中一个寄存器即可
最大的优点是可移植
缺点是执行速度会稍慢一点
基于寄存器的架构
基于寄存器是依赖寄存器进行工作的,但是寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则需要受到硬件的约束
为什么要基于栈
- JVM要设计为与平台无关的,需要保证在没有或者有很少的寄存器的机器上也要同样能正确执行java代码
- 为了指令的紧凑性,减少class文件的大小
解决问题
基于栈的设计会造成频繁的读写,频繁的读写内存肯定会影响执行速度,所以HotSpot JVM中有一个栈顶缓存技术,将栈顶元素全部存储在物理CPU寄存器中,以此降低对内存的读写次数,提升执行引擎的执行效率