栈帧的内部结构
1.每个栈帧中存储着局部变量表,
2.操作数栈,
3.动态链接(指向运行时常量池的方法引用)
4.方法返回地址(或方法正常退出或者异常推出的意义)
5.一些附加信息

1.局部变量表(数字数组) :
主要存储局部变量,方法参数,8种基本数据类型,方法引用,返回值类型
建立再线程的栈上,线程私有数据,不存在数据安全问题

反编译, args参数,
test对象,引用类型是跟着的localVariablesTest, 在索引1的位置上
num定义的变量 在索引2的位置上

编译后局部变量表的大小就确定了 ,且运行时不会改变
局部变量表中的变量旨在当前方法调用中有效,方法调用结束后,方法栈桢销毁,局部变量表随之销毁
\
slot:
32位以内的类型只占一个slot,64的占两位 用起始索引

引用类型也占一个slot long doubule占两个slot

slot 可以重复利用, 出了作用域可以回收,目的节省资源

变量的分类,@1基本数据类型,@2引用数据类型
按照在类中生命的位置分:1.成员变量 : 在使用前都经历过默认初始化赋值, (有默认值)
@1:类变量 linking的准备阶段,类变量默认复制,initail阶段:给类变量显式赋值,即静态代码块赋值(在笔者的双亲委派 一文中有写到)
@2:实例变量 :随着对象的创建,会在堆空间中分配实例变量空间,并进行默认赋值
2.局部变量:在使用前必须进行现实赋值,否则编译不通过
下面的图片的栈的栈帧里面的局部变量表.this占slot0 的位置,num占slot1 的位置 ,局部变量不会给他有默认赋值,否则数组中没有数据

局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或者间接引用的对象都不会被GC (根据根搜索算法,或者叫可达性分析)


浙公网安备 33010602011771号