今天在学习JVM内存结构中的局部变量表和操作数栈,写了一个测试方法:publicvoidtestAdd(){bytei=15;整数j=8;intk=i+j;}大家都知道局部变量表最基本的存储单元是Slot(变量槽)。一个槽是32位,这是一个int或float的长度。比int短的数据类型,如byte、short等,也统一转为int,占用一个slot。因为这是一个非静态方法,所以局部变量表的0位置默认会保存这个。i、j、k分别存储在位置1、2、3。看到这里的startingPC的时候很好奇是什么东西,然后看了一下程序的字节码:当时第一反应是i变量没有在0的位置初始化,怎么办会不会是一开始?3、然后我觉得不对。原来这里的起始PC是变量生命周期开始的指令地址,也就是说i变量执行了字节码中的istore_1(意思是把操作栈顶的元素15保存到局部变量.表1),此时局部变量表中只有i,即正式初始化了i变量。这时,我又好奇了。放入槽的值是15,但是我怎么知道它对应的是变量i呢?百度了一下,原来是局部变量表会为每个slot创建一个索引,通过这个索引就可以成功访问到。局部变量表中指定的局部变量值,索引值范围从0到局部变量表中的最大Slots数。太棒了~
