局部变量表 Local Variables
-
局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(引用类型)。
-
局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的code属性的maximum local variables数据项中。在方法运行期间是不会改变局部变量表的大小的。
-
每一个方法的执行都对应着一个栈帧的入栈。一般来说,栈越大,方法嵌套调用次数越多。对一个函数而言,它的参数和局部变量越多,会使得局部变量表越大,所在的栈帧就越大。进而函数调用就会占用更多的栈空间,导致其嵌套调用次数就会减少。
-
局部变量表中的变量只在当前方法调用中有效。当方法调用结束后随着方法栈帧的销毁,局部变量表也会随之销毁。
为什么局部变量表要定义为数字数组?
- 八种基本数据类型都可以转为数字,char有对应的ASICC码,boolean中0为false,非0为true
- 对于引用类型储存的为地址
Slot:变量槽
- 局部变量表中最基本的存储单元是slot(变量槽)
- 在局部变量表里,32位(4字节)以内的类型只占用一个slot (包括引用类型),64位(8字节)的类型(long和double)占用两个slot。
- byte 、 short 、 char在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true。
- long和double则占据两个slot,索引为第一个slot的位置。
作用
-
JVM会为当前栈帧的局部变量表中的每一个Slot都分配一个访问索引,通过这个索引可以访问到局部变量表中指定的局部变量值。
-
当一个实例方法或构造方法被调用的时候,它的方法参数和方法内部定义的局部变量会按照顺序复制到局部变量表中的每一个Slot上。
-
如果当前栈帧是构造方法或实例方法,构造方法和实例方法因为没有静态的声明,所以会多一个引用,即当前对象this的引用会放在索引为0的slot处(可以调用this关键字);在静态的方法中是不可以引用this的,因为this不存在与当前的局部变量表中,构造方法和实例方法可以使用this是因为如果当前栈帧是构造方法或者是实例方法,那么该对象的引用this会存放在index为0的solt处
什么情况下会创建Slot?
-
当当前栈帧存在局部变量的赋值动作,光是定义一个局部变量时不会创建slot的
- 局部变量必须赋初始值才可以被使用,不赋初始值的话在当前栈帧的的局部变量表的Slot中是没有这个索引的,类变量和实例变量有初始化的过程,所以不用担心。
-
当当前栈帧是构造方法或实例方法
- 会自动将该对象的引用this会存放在index为0的solt处
Solt的重复利用
- 栈帧中的局部变量表中的槽位是可以重用的,如果一个局部变量过了其作用域,那么在其作用域之后声明的新的局部变量就很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。
相关文章
JVM栈(1)-----栈的作用是什么?
JVM栈(2)-----局部变量表
JVM栈(3)-----操作数栈
JVM栈(4)-----动态链接
JVM栈(5)-----方法返回地址&一些附加信息