JVM虚拟机栈:局部变量表

局部变量表存在虚拟机栈的栈帧中。

●局部变量表定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,包括基本数据类型,对象引用,以及returnAddress类型。

●由于局部变量表是建立在线程的栈上,是线程的私有数据,因此不存在数据安全问题。

●局部变量表所需的容量大小是在编译器确定下来的,并保存在方法的code属性的maximum local variables数据项中。方法运行期间不会改变局部变量表的大小。

●局部变量表中的变量只在当前方法调用中有效。在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁。

●局部变量表最基本的存储单元是slot(变量槽)。在局部变量表里,32位以内的类型只占用一个slot(包括returnAddress),64位类型(long和double)占用两个slot。 

关于slot的理解:

●JVM会为局部变量表中的每一个slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值。

●当一个实例方法被调用的时候,它的方法参数和方法体内部定义的局部变量会按照顺序被复制到局部变量表的每一个slot上。

●如果需要访问局部变量表中一个64bit的局部变量值时,只需要使用前一个索引即可(比如:访问long和double类型变量)

●如果当前帧是由非静态方法创建的,那么对象的this指针将会存放在index为0的slot处,其余的参数按照参数表顺序继续排列。

 JVM虚拟机栈:局部变量表_第1张图片

 JVM虚拟机栈:局部变量表_第2张图片

 Slot的重复利用:

②栈帧中的局部变量表的槽位时可以重用的。如果一个局部变量过来其作用域,那么在其作用域之后申明的新的局部变量就很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。

你可能感兴趣的:(jvm,jvm,java,开发语言)