局部变量表
-
Local Variables 局部变量表或者本地 变量表
-
定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量包括基本数据类型和对象引用refrence 和 方法返回地址 returnAddress类型
-
局部变量表是建立在线程栈之上,线程私有,不存在线程安全问题
-
局部变量表所需的容量大小在编译期已经确定下来了,并保存在方法的Code属性maximum local varivables 数据项中,在方法运行期间是不会改变局部变量表的大小
-
方法嵌套调用的次数由栈大小决定,一般来说,栈越大,方法嵌套调用的次数越多.对一个函数而言,他的参数和局部变量越多,使得局部变量表膨胀,他的栈帧就越大,进而栈帧的占用的空间越大,在固定的栈大小的情况下会导致嵌套调用的次数减少
-
局部变量表中的变量只在当前方法调用有效,在方法执行,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程,当方法调用结束后,随着方法栈帧的销毁,局部变量表也会销毁
-
Slot相关
-
参数值存在局部变量表中从索引为0开始的位置开始存储
-
局部变量表中最基本的存储单元是Slot 变量槽 局部变量表中存放编译器可知各种基本数据类型8种 引用数据类型 reference 返回值地址return address
-
在局部变量表中32位的类型只占一个slot包括return address 类型, 64位类型long double占2个slot,占2个slot的以第一个索引位置来表示
-
JVM为每一个局部变量表中每一个Slot分配一个访问索引,通过这个索引即可成功访问到局部变量中的变量值
-
当一个方法被调用时,他的方法参数和方法体中定义的局部变量会按照代码的顺序被复制到局部变量表中Slot,如果是非静态方法(构造方法或者实例方法)局部变量表中的第一个index=0的局部变量为this
-
Slot的重复利用
- 栈帧中的局部变量是可以重复使用的,如果一个局部变量超过了他的作用域,那么在之后作用域之后申明新的变量有可能会使用到之前过期局部变量的操作,从而节省空间
- 栈帧中的局部变量是可以重复使用的,如果一个局部变量超过了他的作用域,那么在之后作用域之后申明新的变量有可能会使用到之前过期局部变量的操作,从而节省空间
-
-
静态变量和局部变量的对比
- 变量分类
- 按数据类型分 基本数据类型 引用数据类型
- 按声明位置分 成员变量(类变量和实例变量) 局部变量
- 类变量: linking的paper阶段给类变量赋默认值,init阶段给变量显示赋值静态代码块中
- 实例变量 随着对象创建 会在堆空间中分配实例变量空间并进行默认赋值
- 局部变量 在使用之前必须显示赋值 否则使用的时候编译失败
- 类变量在linking的paper阶段会被系统初始化,另外一次在initialization阶段人为显示初始化
- 局部变量不存在系统初始化过程,必须人为的初始化,否则无法使用
- 在栈帧中,与性能调优密切相关的就是局部变量表,在方法执行的时候虚拟机使用局部变量表完成方法的传递,局部变量表中的变量也是重要的垃圾回收根节点,只有被局部变量中直接或间接引用的对象才不会被回收
- 变量分类