深入理解JVM:虚拟机字节码执行引擎
一、运行时栈结构 栈帧 是用于支持虚拟机进行方法调用和方法执行的数据结构。 栈帧 包括: 局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 执行引擎运行的所有字节码指令只针对当前栈帧进行操作。需要注意的是一个栈中能容纳的栈帧是受限,过深的方法调用可能会导致StackOverFlowError,当然,我们可以认为设置栈的大小。其模型示意图大体如下: 执行引擎的所有字节码指令都只针对当前栈帧进行操作。 1、局部变量表 是变量值的存储空间,由方法参数和方法内部定义的局部变量组成,其容量用Slot 1 作为最小单位。 slot可以存放32位以内的数据类型。slot的长度可以随处理器、操作系统或虚拟机不同而发生改变。 局部变量表 的大小在编译时就可以确定,Code中的max_local。 局部变量表 不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。 JVM通过索引定位方式使用 局部变量表 。 在方法执行时,如果是实例方法,那么局部变量表的第0位索引的slot默认是用于传递方法所属类实例的引用(也就是this)。 2、操作数栈 操作数栈 的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。 另外我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是 操作数栈 。 操作数栈