深入JVM 栈帧数据结构

——局部变量表

局部变量表(Local Variadble Table)是一组变量值存储空间,用于存放方法参数和方法内定义的局部变量。在Java程序编译为Class文件时,在方法的Code属性的max_locals数据项中确定该方法所需要分配的局部变量表的最大容量

局部变量表的容量以变量槽(slot)为最小单位,虚拟机规范中没有规定槽的大小,它允许具体数据类型随着处理器、操作系统而大小发生改变。一个槽可以存放一个32位以内的类型数据,Java中占用32位以内的数据类型有boolean byte char short int floadt reference和returnAddress

其中reference类型表示对一个对象实例的引用,虚拟机规范既没有说明它的长度,一般而言,虚拟机通过引用至少做到2点:一是从此引用中直接或间接地查找到对象在Java堆中的数据存放的起始地址,二是通过此引用中直接或间接地查找到对象所属数据类型在方法区存储的类型信息

虚拟机通过索引定位的方式使用局部变量表,索引值的范围从0开始至局部变量表的最大slot槽数目。如果访问的是32位数据类型的变量,索引n就代表了使用第n个slot,如果是64位数据的两个slot

在执行方法时,虚拟机是使用局部变量表完成参数值到参数变量列表的传递过程,如果执行的是实例方法,那局部变量表第0位索引的slot默认是用于传递所属对象实例的引用,在方法中通过this关键字来访问这个隐含参数。其余参数按照参数列表顺序排列,占用从1开始的局部变量slot,参数分配完后,在根据方法体内部定义的变量顺序分配其余的slot

——操作数栈

操作数栈(Operand Stack)也称为操作栈,它是一个后入先出栈。同局部变量表一样,操作数栈的最大深度在编译期就确定并写入到Code属性的max_statcks中,操作数栈的每一个元素可以是任意的Java类型,包括long double。32位数据类型占容量1 64位数据类型占栈容量2.在方法执行的任何时候,操作数栈的深度不会草果max_stacks数据项设定的最大值、

当一个方法刚刚开始执行时候,操作数栈是空的,在方法的执行的过程中,各种字节码指令往操作数栈写入和提取内容,也就是入栈和出栈动作。如进行算术运算时采用操作数栈,又或者在调用其它方法时候通过操作数栈进行参数传递

——方法返回地址

当一个方法开始执行后,只有2种方式可以退出这个方法。

第一种方式是执行引擎遇到任意一个方法的返回的字节码指令,这时候可能会有返回值传递给上层的方法调用者,是否有返回值和返回值类型根据何种方法的返回指令决定,这种退出方法称为正常完成出口

另一种退出方式,在方法执行过程遇到了异常,并且这个异常无法在方法体内处理,无论是Java虚拟机内部的异常,还是代码中使用athrow字节码指令产生的异常,只要在本方法异常表中没有搜索到匹配的异常处理,就会导致方法退出。

 

你可能感兴趣的:(Java进阶,深入理解Java虚拟机)