栈的存储结构和原理

栈中的数据以栈帧为格式存储

一个方法对应一个栈帧。

如果一个方法出现异常,会返回给前面的栈帧。

不能在一个栈里使用另一个线程的栈帧

栈帧的内部结构

每个栈帧存储着:

局部变量表(本地变量表)

操作数栈

动态链接(指向运行时常量池的方法引用)

方法返回地址(方法正常退出或异常退出的定义)

附加信息

局部变量表或本地变量表(菜谱里的原料表)

是一个数组数组,主要存储方法参数和方法体内的局部变量

数据类型包括:基本数据类型,对象的引用,returnAddress类型

容量大小在编译期确定下来的。

Slot(变量槽)

局部变量表的基本存储单元是slot

4字节类型占用一个slot

8字节类型(long,double)占用两个slot

如果当前帧是由构造方法或实例方法创建的,引用对象this放在index为0的slot处

slot重复利用,若变量已销毁,但是slot空间还在,那么会分配新的变量放在那里

静态变量和局部变量小结

显示赋值就是等号赋值

类里的变量叫成员变量(全局变量)

成员变量加上static叫静态变量(或类变量),类加载的linking阶段赋有默认值,初始化阶段进行显示赋值(

没static的成员变量叫实例变量,只有在类实例化时才被赋值(new对象),堆里分配空间,进行默认赋值

在方法里的叫局部变量必须显示赋值,否则编译不通过

局部变量表中的变量是垃圾回收的根节点,只要被局部变量表中直接或间接引用的对象都不会被回收?

操作数栈(菜谱中的执行步骤的容器) 忘了看视频

方法里的数据一开始在操作数栈里,出栈后放在局部变量表中

数组实现的操作数栈。所以编译阶段确定操作数栈的深度

根据字节码指令,往栈里写入或提取数据(入栈,出栈),过程中结合执行引擎

执行引擎将字节码翻译成机器指令,由cpu进行运算。

操作数栈里保存:保存计算过程的中间结果,作为计算过程中变量的临时存储空间,方法的返回值压入栈(大栈)里,更新pc寄存器下一条需要执行的字节码指令,下一个栈帧获取这个返回值

4字节数据占用一个栈深度单位

8字节数据占用两个栈深度单位

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值