Java中方法的局部变量是放在虚拟机栈的局部变量表里面,形参也算一个。
本地变量表,就是局部变量表,只是翻译不同。
栈帧以变量槽为最小单位。
快速认识
代码说明
public static void main(String[] args) {
byte[] waste = new byte[6 * 1024 * 1024];
int new_var = 0;
System.gc();
}
反编译得到:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: ldc #2 // int 6291456
2: newarray byte
4: astore_1
5: iconst_0
6: istore_2
7: invokestatic #3 // Method java/lang/System.gc:()V
10: return
变量槽 Slot
局部变量表的容量以变量槽(Variable Slot)为最小单位,虚拟机中并没有明确指明一个Slot应占用的内存空间大小,只是很有导向性的说到每个Slot都应该能存放一个下面8种类型的其中一个。
- boolean
- byte
- char
- short
- int
- float
- reference
- returnAddress
不使用的对象,应当手动赋值为null
为了尽可能节省栈空间,局部变量表的Slot可以复用。
方法体中定义的变量,其作用域并不一定覆盖整个方法体,如果当前字节码PC计数器的值已经超出了某个变量的作用域,那这个变量对应的Slot就可以交给其他变量使用。