明天在学 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 数量。切实是妙啊~