1.3.1 解释执行
(1)概述
解释执行就是将字节码在位于内存上的“基于栈的指令集执行引擎”中直接执行
(2)指令集比较
a.基于栈的指令集(字节码)
优点
可移植性
寄存器由硬件直接提供,程序直接依赖这些硬件寄存器则不可避免地要受到硬件的约束。
使用栈架构的指令集,用户程序不会直接用到这些寄存器,那就可以由虚拟机实现来自行决定把一些访问最频繁的数据(程序计数器、栈顶缓存等)放到寄存器中以获取尽量好的性能,这样实现起来也更加简单
代码相对更加紧凑
字节码中每个字节就对应一条指令,而多地址指令集中还需要存放参数
编译器实现更加简单
不需要考虑空间分配的问题,所需空间都在栈上操作
缺点
执行速度慢
指令数量多
指令数量比寄存器架构多,因为出栈、入栈操作本身就产生了很多指令
内存访问慢
栈在内存中实现,内存速度比CPU速度慢
b.基于寄存器的指令集(机器码)
优点
执行速度快
缺点
平台相关
1.3.2 编译执行
(1)概述
即时编译器并不是虚拟机必需的部分,Java虚拟机规范并没有规定Java虚拟机内必须要有即时编译器存在,更没有限定或指导即时编译器如何实现。因此不同的虚拟机有不同的实现方式
编译的结果是将字节码转换成平台相关的机器码,这些机器码将在CPU的寄存器上运行
(2)解释器与编译器的比较
当程序需要迅速启动和执行时,解释器可以首先发挥作用,省去编译时间,立即执行。
在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率。
当程序运行环境中内存资源限制较大(如部分嵌入式系统中),可以使用解释执行节约内存,反之可以使用编译执行提升效率。
解释器还可以作为编译器激进优化时的一个"逃生门",让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化假设不成立时可以通过“逆优化”退回到解释状态继续执行
以上也是“为何虚拟机要使用解释器与编译器并存的架构”的原因
1.3.3 内存管理
内存管理分为:运行时数据区和内存分配与回收两大部分,每一部分的内容都比较多,将单独进行介绍