请问关于jvm中StackMapTable整个原理说明?

求助大佬,这块看不懂,他是如何帮助jvm验证字节码类型的

阅读 5.1k
2 个回答

这个要说整个原理内容有点多,我简单点说... StackMapTable主要用来验证跳转前后locals、stack中的类型和大小一致。
StackMapTable有多个StackMapFrame组成,第一个StackMapFrame也就是init_frame不在StackMapTable中,后一个frame需要依赖前一个frame来得到完整的信息。一个frame中包含的信息有 locals、stack、offset等,具体的数据结构可以参考规范jvms-4。有几种frame我们会经常碰到,same_frame、same_frame_extended 、append_frame,例如append_frame就是和前面一个frame相比,这个frame增加了局部变量,这也是前面说的后一个frame要依靠前一个frame来获取完整信息。 我举个包含这几种frame的例子:

public void test() {  
        //init_frame locals=[this]
        int i = 1;
        String name = "xx";

        if(i > 1){   //ifxx
            int tmp = 66;
            //frame[0] append_frame locals[int,Object]
        }else{  //goto
            int tmp = 88;
            //frame[1] same_frame 
        }
        
        int i2 = 88;
        if(i2 < 8){  //ifxx
            int tmp = 99;
            //frame[2] append_frame locals[int]
        }else{ //goto
            //增加指令数 超出same_frame的最大偏移
            int tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;
            tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;
            tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;tmp = 99;
            //frame[3] same_frame_extended
        }

    } 

一般编译器碰到一个跳转指令(ifxx/goto等)就会生成一个frame来描述跳转处的locals情况
好,到了链接时校验方法字节码的时候会把方法的所有指令都线性扫一遍,碰到store类指令(istroe、fstore等)就会把在init_frame.locals中保存一个type,碰到跳转指令就会把init_frameStackMapTable中对应offset的frame对比看看locals stack 类型 大小是否一致来判断跳转前后局部变量是否发生变化

https://hllvm-group.iteye.com... 有片r大的 参考,顺便 我的回复7是错的 slot本身就是共享,但是 并不是因为slot共享才有的stackMapFrame R大的帖子 对于这块也只是 提了下 有了StackMapTable之后,JVM在做Class文件的字节码校验时就可以比较方便的做类型检查 ,具体怎么方便或者说 1.7前身的类型推导->类型检查的演变过程原理还是一脸懵逼,望有大佬指点下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
1 篇内容引用
宣传栏