StackMapTable 的理解

新手上路,请多包涵

最近看了很多关于 StackMapTable 的资料,包括《Java 虚拟机规范》以及这些链接:

  1. https://segmentfault.com/q/10...
  2. https://hllvm-group.iteye.com...

但是始终不得要领,以这个例子作为说明:

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  
    }  
}  

疑问主要有:

  1. 为什么 k=0 不算在局部变量的变化中?
  2. locals 和局部变量表是什么关系?
  3. 什么时候才需要 frame?

对此我前后花了很多时间来研究这个,都没有搞清楚,困扰我良久,内心更似火挠,有哪位对此了解的人,诚心求教!

阅读 2.6k
1 个回答
新手上路,请多包涵

我不知道 StackMapTable是啥。但在字节码的知识中Code属性下,也有一个 locals 字段标识方法执行过程中需要最大分配的局部变量表容量,因此我推测是一个东西。
image.png
第 8,9 行将 k 存入了局部变量表中,在第10, 11行随着 if 代码块结束,k 作用域结束被回收,对应局部变量表下标为 3 可以被复用了。

总结下:

  • k = 0也被放入了局部变量表中了,不过后面随着作用域结束,后续被 l=0 覆盖了
  • locals = localVariableTable 的大小
  • frame我猜测你指的是栈帧,当方法调用时,就会创建一个栈帧入虚拟机栈,方法执行结束,栈帧出栈销毁
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏