1. 运行时的栈帧结构
- 栈帧:用于支持虚拟机进行方法调用和方法执行的数据结构,存储了方法的局部变量表、操作数栈、动态链接和方法返回地址。
- 每个方法调用到完成对应的栈帧的入栈和出栈。
- 可能很多的方法会同时处于执行状态,只用栈顶的才是有效的,称为
当前栈
1.1 局部变量表
- 是一组变量值存储空间,用于存放
方法参数
和方法内部定义的局部变量
- 基本单位是
slot
- 存放的类型有:32位的boolen、byte、char、short、int、float、
reference
或returnAddress
以及64位的double、long - reference:表示对一个
对象实例的引用
。1.通过其能找到在堆中的地址 2.通过其能找到在方法区存储的类型定义 - returnAddress:指向字节码指令的地址
- 虚拟机通过
索引
定位局部变量 - slot是存在复用的,如下所示
- 此时代码脱离了placeholder的范围,会释放该变量
- 注:在方法中定义的局部变量,不会被自动初始化
1.2 操作数栈
- 是一个后入先出的栈,每一个元素可以是任意的Java数据类型
- 在方法的执行过程中,会不断的往操作数栈中
写入数据(入栈)
或者读取数据(出栈)
例一
算术运算
现将需要运算的数字入栈,再将数字出栈并运算,将结果入栈
例二
- 调用其他方法时,通过入栈进行
参数传递
- 但是有时虚拟机也会设置两个栈帧存在重叠区域,可以
避免重复的复制
1.3 动态连接
- 指向运行时常量池中的该栈帧所属方法的引用
1.4 方法返回地址
- 方法有两种退出方式:
return
和异常
(异常不会返回返回值) - 方法退出后需要返回其上层方法,即调用自己的方法。