今天在学JVM内存结构中的局部变量表和操作数栈,写了一个测试方法:

public void testAdd(){
        byte i = 15;
        int j = 8;
        int k = i + j;
}

大家知道局部变量表最基本的存储单元是 Slot(变量槽)。一个槽32位,也就是一个int或float的长度,比int短的数据类型比如byte,short等也都是统一转换为int,占用一个槽。因为这里是非静态方法,局部变量表的0位置默认会保存this。i,j,k分别保存在1,2,3的位置。

我当时看到这里的起始PC,就很好奇是什么东西,然后我就看了看程序的字节码:

当时第一反应是i变量不是在0的位置开始初始化嘛,怎么会起始时3呢,然后一想不对,原来这里的起始PC是这个变量生命周期开始的指令地址,也就是说i变量在字节码执行完istore_1(意思是讲操作栈顶的元素15保存到局部变量表1的位置),这时候局部变量表里才有i,也就是i变量才正式的完成初始化。这时候我又好奇,放进slot的值是15,但是怎么知道它对应的是i这个变量呢,百度一查,原来局部变量表会为每个slot建立索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值,索引值的范围从 0 开始到局部变量表最大的 Slot 数量。实在是妙啊~


MalePhilosopher
1 声望0 粉丝

Recalcitrant and debonair