JVM之虚拟机栈(一)栈帧中的局部变量表
程序员文章站
2022-04-18 19:13:56
...
基本概念
-
局部变量表是一个数值数组
为什么呢?
1.各种基本书籍类型,可以用数值表示.
2.如果是 对象引用(来自堆,元空间),也可以用数值表示
3.还有return Address类型 -
局部变量表的容量是在编译期确定下来的
-
局部变量表的基础单位是Slot(变量槽),其中一个32位的类型占1个槽,64位(long double)占64位。
jvm会为局部变量表的每一个slot都分配一个访问索引
当一个实例方法被调用时,它的方法参数和方法体内部定义的局部变量将会按照顺序被复制到局部变量表到每一个slot上
this变量在局部变量表中的特殊地位
如果当前栈帧是有构造方法或者实例方法创建到,那么该对象的引用this会存放在index为0到slot处。而静态方法就不会。
Slot的重复利用
栈帧中的局部变量表中的槽位是可以重用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的局部变量就有可能会复用过期局部变量的槽位,从而达到节省资源的目的
public static void test(){
{
int a = 10;
System.out.println(a);
}
int b = 20;
在 编译代码中,a和b的索引都是0,因为局部变量a作用域仅限于大括号,所以过了括号之后已经失效了,那么在其作用域之后申明的局部变量就有可能会复用过期局部变量的槽位,从而达到节省资源的目的
特别说明
局部变量表中的变量也是重要的垃圾回收根节点,只要被其引用或间接引用的对象都不会被回收