0
点赞
收藏
分享

微信扫一扫

Java-虚拟机-局部变量表


局部变量表是java中栈帧的组成之一,用来存放入参和方法内的局部变量,局部变量表是一个数组,数组中每个元素至少占用4个字节(这与虚拟机规范有关,因为虚拟机规范要求虚拟机的字不少于32位),本文假设是在32位操作系统的hotspot虚拟机,所以局部变量表是一个每个元素4或者8字节的数组,长度不定,因为长度取决于方法的大小,如果方法太长,那么压栈帧的时候,这个局部变量表会很大,反之会很小,假设代码如下

public class MyClass {

public static int m1(int a,long b,float c,double d,Object e,byte f) {
int x=6;
int y=7;
int z=x+y;
return z;
}

public int m2(char a,int b,boolean c) {
return 0;
}
}

对于方法m1,它的局部变量表是这个样子的,这些初始值是调用m1方法的那个方法,从自己的栈中弹出,放到m1的局部变量表中的,当执行x=6的时候,会执行​​bipush 6​​​指令,将6从m1局部变量表中拿出来,然后入栈,接下来执行​​istore 8​​​指令将6放到第8个位置,y=7同理,接下执行​​iload​​指令两次,将6和7入栈,执行add指令,对栈顶两个数相加,放到第10个位置,最后返回,从下图可以看出f占用了4个字节,而参数是byte类型,为了字节对齐,局部变量表使用最小单位是字,所以会将byte转成4个字节存储,如下图

Java-虚拟机-局部变量表_操作数


对于方法m2,它的局部变量表多出来一个this指针(与C++完全相同),这是调用m2的那个方法,从自己的栈中弹出来的,然后放到m2的局部变量表中,根据规范,必须以字为单位,所以char和boolean也是按照4字节来存储在局部变量区的,m2的局部变量表如下图

Java-虚拟机-局部变量表_java_02

继续看下面的代码

1.m3调用m4之前,m3会将4和5放到自己的操作数栈
2.m3从自己的操作数栈中弹出,再放到m4栈帧中的局部变量表的1和2的位置(0位置被this引用占据)
3.m4执行的时候,从自己的局部变量表1和2的位置加载(iload)4和5到自己的操作数栈
4.m4执行完毕之后,将返回值压到m3的操作数栈

public int m3() {
int a=4;
int b=5;
int c=m4(a,b);
return c;
}
public int m4(int a,int b) {
return a+b;
}

注:除iinc指令之外,要想操作局部变量表中的数据,必须得通过栈才能修改局部变量表的值

局部变量表相关属性
locals:表示局部变量表占据多少个元素(字,每个字4字节),例如locals 5,则表示占据20个字节(32位hotspot下)


举报

相关推荐

0 条评论