虚拟机栈存储的数据
栈帧
什么是栈帧?
栈帧是一种数据结构,用于支持JVM方法的正常执行
栈帧存储的内容
- 局部变量表
- 操作数栈
- 动态链接
- 方法返回地址
当前栈帧、当前方法、当前类
位于当前JVM栈顶的栈帧被称为当前栈帧,栈帧对应的方法被称为当前方法,定义该方法的类被称为当前类;
执行引擎中运行的所有字节码指令都只针对当前栈帧进行操作。
局部变量表
局部变量表是一组变量存储空间,存储的内容为方法参数和定义在方法中的局部变量;
需要注意的是下标0中存储的内容,如果是非静态方法则留给this引用
局部变量表存储的类型
- 基本数据类型
- 引用类型
局部变量表的存储顺序
- this引用
- 方法参数
- 方法内声明的变量
存储的容量
局部变量表的容量以变量槽作为最小存储单位,JVM规定一个槽应该存放一个4字节以内的数据类型
操作数栈
JVM指令执行是以栈的形式进行的。还有一种指令执行方式是寄存器的方式,相较于寄存器,基于栈执行可移植性更强,但效率较差;
操作数栈是干什么的?
数据进行操作的地方,在数据源获取到数据,对数据进行加工(加减乘除)返回结果;
操作数栈数据源
- 局部变量表
- 常量池
- 实例变量
存储内容
可以为任意Java数据类型,一个栈容量为32位,64数据类型占两个栈
存储容量
指定max_stacks
总结:一个方法的执行需要两个栈的参与,JVM栈将方法压入栈形成栈帧,对数据进行操作的时候需要将数据压入操作数栈,操作完后出栈,方法执行完后将栈帧弹出栈
动态链接
在虚拟机栈的栈帧中都存储着指向该栈所属方法的符号引用,用以支持动态链接。
将方法中的符号引用转换为实际的调用地址时有两个时机,一个是在类加载解析阶段时完成,这个时机只能够完成静态方法和私有方法的替换。这类解析被称为静态解析;而实例方法需要在运行时进行替换这类解析被称为动态链接
方法返回
两种返回,将返回的结果压入到调用者的局部变量表中
- 正常完成返回
- 异常完成返回