栈中的数据以栈帧为格式存储
一个方法对应一个栈帧。
如果一个方法出现异常,会返回给前面的栈帧。
不能在一个栈里使用另一个线程的栈帧
栈帧的内部结构
每个栈帧存储着:
局部变量表(本地变量表)
操作数栈
动态链接(指向运行时常量池的方法引用)
方法返回地址(方法正常退出或异常退出的定义)
附加信息
局部变量表或本地变量表(菜谱里的原料表)
是一个数组数组,主要存储方法参数和方法体内的局部变量
数据类型包括:基本数据类型,对象的引用,returnAddress类型
容量大小在编译期确定下来的。
Slot(变量槽)
局部变量表的基本存储单元是slot
4字节类型占用一个slot
8字节类型(long,double)占用两个slot
如果当前帧是由构造方法或实例方法创建的,引用对象this放在index为0的slot处
slot重复利用,若变量已销毁,但是slot空间还在,那么会分配新的变量放在那里
静态变量和局部变量小结
显示赋值就是等号赋值
类里的变量叫成员变量(全局变量)
成员变量加上static叫静态变量(或类变量),类加载的linking阶段赋有默认值,初始化阶段进行显示赋值(
没static的成员变量叫实例变量,只有在类实例化时才被赋值(new对象),堆里分配空间,进行默认赋值
在方法里的叫局部变量,必须显示赋值,否则编译不通过
局部变量表中的变量是垃圾回收的根节点,只要被局部变量表中直接或间接引用的对象都不会被回收?
操作数栈(菜谱中的执行步骤的容器) 忘了看视频
方法里的数据一开始在操作数栈里,出栈后放在局部变量表中
数组实现的操作数栈。所以编译阶段确定操作数栈的深度
根据字节码指令,往栈里写入或提取数据(入栈,出栈),过程中结合执行引擎
执行引擎将字节码翻译成机器指令,由cpu进行运算。
操作数栈里保存:保存计算过程的中间结果,作为计算过程中变量的临时存储空间,方法的返回值压入栈(大栈)里,更新pc寄存器下一条需要执行的字节码指令,下一个栈帧获取这个返回值
4字节数据占用一个栈深度单位
8字节数据占用两个栈深度单位