栈帧的内部结构

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 (根据根搜索算法,或者叫可达性分析)

 

 

posted @ 2021-10-18 14:11  lamda表达式先驱  阅读(543)  评论(0)    收藏  举报