JVM虚拟机栈之局部变量表

上图是每个栈帧的内部结构,一个栈能放多少栈帧,取决于栈帧的大小,栈帧的大小取决于局部变量表

这篇主要讲解 局部变量表

一,概念:

(1)局部变量表也被称之为局部变量表数组或本地变量表

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

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

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

如图:javap命令反编译:

或者使用jclasslib 插件:

局部变量表长度是三,在编译期间就确定下来的 

(5)局部变量表中的变量只在当前方法调用中有效。在方法执行时,虚拟机通过使用局部变量表完成参数值到参数变量列表的传递过程。当方法调用结束后,随着方法

栈帧的销毁,局部变量表也会随之销毁。

二、使用jclasslib 来分析局部变量表:

(1)先编写一段代码:如下图:

(2)使用jclasslib 工具分析main()方法:

(3)

关于main 方法的一些描述信息。

(4)点击code 如图:

就是一些自己码指令

关于异常的都存在异常表中

可以看到代码长度,版本号,和局部变量表的长度。

(6)点击code 下的LineNumberTable 

可以看到字节码指令对应java 代码的行号

(7)点击LocalVariableTable 

Start Pc+Length 可以看到局部变量的作用范围。

三、solt的理解:

局部变量表参数值的存放总时在局部变量数组的index0的开始,到数组长度-1的索引结束。

局部变量表,最基本的存储单元时slot(变量槽) 

局部变量表中存放编译期可知的各种基本类型,引用类型,returnaddress 类型的变量

在局部变量表里,32位机翼内的类型占用一个slot(包括returnAddress 类型),64位的类型(long 和double )占用两个slot,如果需要访问局部变量表中一个64位的局部变量值时,只需要使用前一个索引即可。如图:

如果当前帧时由构造方法或者实例方法创建的,那么该对象引用this 将会存放在index为0的slot处,这就是为什么静态方法不能使用this的原因了,因为this引用不存在静态方法的栈帧中。如图:

四、slot的重复利用:

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

看下面代码:

使用jclasslib 分析:

发现局部变量应该有四个 this,a,b,c, 但b过期了,所以局部变量的表的长度时3

发现c 复用了b的索引为2的变量槽。

五、变量的分类:按照数据类型分:(1)基本数据类型,(2)引用数据类型

                      按照在类中生命的位置分:(1)成员变量:在使用前,都经历过默认初始化赋值。

                                                                                           类变量:linking的prepare阶段:给类变量默认赋值 ---> inital阶段:对类变量显示赋值

                                                                                            实例变量:随着对象的创建,会在对空间中分配实例变量空间,并进行默认赋值

                                                                    (2) 局部变量:在使用前,必须要进行显示赋值才能使用

  六、 注意:局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收

                                                             

猜你喜欢

转载自blog.csdn.net/Hao_JunJie/article/details/115189946
今日推荐