最近看了很多关于 StackMapTable 的资料,包括《Java 虚拟机规范》以及这些链接:
但是始终不得要领,以这个例子作为说明:
public class Foo {
public void foo() {
// basic block 1 start
int i = 0;
int j = 0;
if (i > 0) {
int k = 0;
// basic block 1 end
}
// basic block 2 start
int l = 0;
// basic block 2 end
}
}
疑问主要有:
- 为什么 k=0 不算在局部变量的变化中?
- locals 和局部变量表是什么关系?
- 什么时候才需要 frame?
对此我前后花了很多时间来研究这个,都没有搞清楚,困扰我良久,内心更似火挠,有哪位对此了解的人,诚心求教!
我不知道 StackMapTable是啥。但在字节码的知识中Code属性下,也有一个 locals 字段标识方法执行过程中需要最大分配的局部变量表容量,因此我推测是一个东西。
第 8,9 行将 k 存入了局部变量表中,在第10, 11行随着 if 代码块结束,k 作用域结束被回收,对应局部变量表下标为 3 可以被复用了。
总结下: