热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Jvm:编译器需要在方法字节码中的哪些位置指定堆栈映射帧?

如何解决《Jvm:编译器需要在方法字节码中的哪些位置指定堆栈映射帧?》经验,为你挑选了1个好方法。

这是asm用户指南的摘录:

为了节省空间,编译方法每个指令不包含一个帧:实际上它只包含与跳转目标或异常处理程序相对应的指令的帧,或者遵循无条件跳转指令.实际上,可以从这些框架中容易且快速地推断出其他框架.

我可以理解为什么jvm需要跳转目标和异常处理程序的堆栈映射帧,但是goto在不必要的需求之后不需要有堆栈映射帧,因为在方法字节码中的某处必须有一个跳转指令在指令之后的goto指令,该情况将由第一个要求处理.它必须是这样的,否则后面的指令goto将无法访问,因此是可丢弃的.

例:

下面给出了一个方法及其字节码:

public class t {
    public static void main(String[] s) {
        int i = 10;
        while ( i > 0 ) {
            i = i + 1;
        }
        int j = 10;
    }
}



  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: bipush        10
         2: istore_1
         3: iload_1
         4: ifle          14
         7: iload_1
         8: iconst_1
         9: iadd
        10: istore_1
        11: goto          3
        14: bipush        10
        16: istore_2
        17: return
      LineNumberTable:
        line 9: 0
        line 10: 3
        line 11: 7
        line 13: 14
        line 14: 17
      StackMapTable: number_of_entries = 2
        frame_type = 252 /* append */
          offset_delta = 3
          locals = [ int ]
        frame_type = 10 /* same */
}

index 11处的指令是一个goto指令,索引处的指令414,指令就在11它的跳转目标之后.

在无条件跳转后需要堆栈映射框架的理性是什么?



1> Antimony..:

堆栈映射的目标是允许在单个线性传递代码中执行验证.

如果按照goto语句代码中有没有跳转指向它,那么代码是死的,理论上并不需要进行验证.但是,验证者不知道这一点.由于它在代码中执行单次传递,因此无法提前知道代码是否已死.因此,它必须验证所有内容,这意味着它需要一个堆栈框架来开始.

请注意,这与传统的非堆栈映射验证程序不同.在引入堆栈映射之前,验证器将简单地迭代它找到的所有代码(有效地)跟随跳转,并迭代直到收敛.这意味着在旧的验证器下,根本不会触及死代码.


推荐阅读
  • 【JVM原理探索,阿里内部核心Java进阶手册
    #17NameAndType#5:#6simpleField:I#18Utf8LSimpleClass;#19Utf8javalangObject###[](https:codec ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 1、完成图标功能要实现图标功能,首先是后端建表建dict表DROPTABLEIFEXISTSdict;CREATETABLEdict(namevarchar(2 ... [详细]
  • Project2.cpp:定义应用程序的入口点。#includeframework.h#includeProject2.h#defineMAX_LOADSTRING100全 ... [详细]
  • 安卓编年史(4):Android
    安卓0.9显示着横屏的主屏幕——后续一些版本无法实现的一个特性[RonAmadeo供图]尽管从功能上很难将模拟器和操作系统区分开,但安卓0.9是第一个支持横屏显示的版本。更让人惊讶 ... [详细]
  • 1.javap反汇编工具javap是jdk自带的反汇编工具,可以通过该命令查看编译后的class文件的常量池、字段以及方法等信息。对于下面的这个类:pu ... [详细]
author-avatar
可爱的嗨-我喜欢你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有