5.3.8 栈帧
栈帧由三部分组成:局部变量区,操作数找和帧数据区。局部变量区和操作数栈的大小要 视对应的方法而定,它们是按字长计算的。编译器在编译时就确定了这些值并放在class文件中。 而帧数据区的大小依赖于具体的实现。 当虚拟机调用一个Java方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数 栈的大小,并据此分配栈帧内存,然后压人Java栈中。 局部变量区 Java栈帧的局部变量区被组织为一个以字长为单位、从0开始计数的数组。字 节码指令通过从0开始的索引来使用其中的数据。类型为int、float, reference和returnAddress的值在数组中只占据一项,而类型为byte、short和char的值在存人数组前都将被转换为int值,因而同样占据一项。但是类型为long和double的值在数组中却占据连续的两项。 在访问局部变量中的long和double值的时候,指令只需指出连续两项中第一项的索引值。例 如某个long值占据第3、4项,那么指令会取索引为3的long值。局部变量区的所有值都是字对齐 的,long和double这样占据两项数组元素的值同样可以起始于任何索引。 局部变量区包含对应方法的参数和局部变量。编译器首先按声明的顺序把这些参数放入局 部变量数组。图5-9描绘了下面两个方法的局部变量区。 我们注意到,在源代码中的byte、short.