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