JVM StackMapTable 属性的作用及理解

JVM的StackMapTable属性自Java 6起被引入,用于提升类型检查验证的效率,成为Code属性的组成部分。虽然栈图在Java 7后成为必选,但它对整体性能提升有限,主要节省了部分验证时间。Java 8规范中,StackMapTable具有明确的结构,包括attribute_name_index、attribute_length、number_of_entries和entries表。
摘要由CSDN通过智能技术生成

 

      在Java 6版本之后JVM在class文件中引入了栈图(StackMapTable)属性。作用是为了提高JVM在类型检查的验证过程的效率,以下简称StackMapTable为栈图。 栈图结构位于Code属性(指Classfile的Code属性)的属性表( attributes table)结构中。在字节码的Code属性中最多包含一个StackMapTable属性。在Java 7版本之后把栈图作为字节码文件中的强制部分。 本来程序员是不需要关心JVM中的JIT编译器的细节,也不用知道编译原理或者数据流、控制流的细节。但栈图强制了,如果要生成bytecode,必须准确知道每个字节码指令对应的局部变量和操作数栈的类型。这是因为Java7在编译的时期做了一些验证期间要做的事情,那就是类型检查,也就是栈图包含的内容。

     想想都比较抓狂,但是JVM做的这一点点性能优化对整体性能提升也没起到什么卵用。Java的验证在类加载的时候只会运行一次,而占据了大部分时间的操作是IO的消耗,而不是验证过程。即使现在有了栈图,验证过程依然会执行,栈图的存在只是节省了一部分的验证时间。并且JVM的设计者还必须兼容没有栈图的验证的实现,因为Java7以前版本是没有强制栈图这个概念的,然而Java8依然延续了栈图的字节码结构。

   jvm8的规范中(https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.4),栈图的标准结构如下:

StackMapTable_attribute {
    u2              attribute_name_index;
    u4              attribute_length;
    u2              number_of_entries;
    stack_map_frame entries[number_of_entries];
}

  

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值