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

Java虚拟机之指令集

1概述Javac编译后的java文件的Code部分最终会保存在class文件的属性表集合的Code字段中。Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Op

1 概述

Javac编译后的java文件的Code部分最终会保存在class文件的属性表集合的Code字段中。

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的操作码(Opcode)以及跟随其后的零至多个代表此操作所需参数的操作数(Operands)所构成。

对于大部分为与数据类型相关的字节码指令,他们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表float,d代表double,a代表reference。

2 加载和存储指令
  1. 将一个局部变量加载到操作栈的指令包括有:
    iload、iload_、lload、lload_、fload、fload_、dload、dload_、aload、aload_

  2. 将一个数值从操作数栈存储到局部变量表的指令包括
    istore、istore_、lstore、lstore_、fstore、fstore_、dstore、dstore_、astore、astore_

  3. 将一个常量加载到操作数栈的指令包括有
    bipush、sipush、ldc、ldc_w、ldc2_w、aconst_null、iconst_m1、iconst_、lconst_、fconst_、dconst_

  4. 扩充局部变量表的访问索引的指令:wide

3 运算指令
  1. 加法指令:iadd、ladd、fadd、dadd
  2. 减法指令:isub、lsub、fsub、dsub
  3. 乘法指令:imul、lmul、fmul、dmul
  4. 除法指令:idiv、ldiv、fdiv、ddiv
  5. 求余指令:irem、lrem、frem、drem
  6. 取反指令:ineg、lneg、fneg、dneg
  7. 位移指令:ishl、ishr、iushr、lshl、lshr、lushr
  8. 按位或指令:ior、lor
  9. 按位与指令:iand、land
  10. 按位异或指令:ixor、lxor
  11. 局部变量自增指令:iinc
  12. 比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp
      

4 类型转换指令

Java虚拟机对于宽化类型转换直接支持,并不需要指令执行,包括:

  1. int类型到long、float或者double类型
  2. long类型到float、double类型
  3. float类型到double类型

窄化类型转换指令包括有
i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l和d2f

窄化类型转换很可能会造成精度丢失。

5 对象创建与操作指令
  1. 创建类实例的指令:new
  2. 创建数组的指令:newarray,anewarray,multianewarray
  3. 访问类字段(static字段,或者称为类变量)和实例字段(非static字段,或者成为实例变量)的指令:getfield、putfield、getstatic、putstatic
  4. 把一个数组元素加载到操作数栈的指令:baload、caload、saload、iaload、laload、faload、daload、aaload
  5. 将一个操作数栈的值储存到数组元素中的指令:bastore、castore、sastore、iastore、fastore、dastore、aastore
  6. 取数组长度的指令:arraylength
  7. 检查类实例类型的指令:instanceof、checkcast
  8. 操作数栈管理指令(直接操作操作数栈的指令):pop、pop2、dup、dup2、dup_x1、dup2_x1、dup_x2、dup2_x2和swap

6 控制转移指令:
  1. 条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if_icmpeq、if_icmpne、if_icmplt, if_icmpgt、if_icmple、if_icmpge、if_acmpeq和if_acmpne
  2. 复合条件分支:tableswitch、lookupswitch
  3. 无条件分支:goto、goto_w、jsr、jsr_w、ret

7 方法调用和返回指令
  1. invokevirtual指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
  2. invokeinterface指令用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。
  3. invokespecial指令用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和父类方法。
  4. invokestatic指令用于调用类方法(static方法)
  5. invokedynamic指令用于调用以绑定了invokedynamic指令的调用点对象(call site object)作为目标的方法。调用点对象是一个特殊的语法结构,当一条invokedynamic指令首次被Java虚拟机执行前,Java虚拟机将会执行一个引导方法(bootstrap method)并以这个方法的运行结果作为调用点对象。因此,每条invokedynamic指令都有独一无二的链接状态,这是它与其他方法调用指令的一个差异。
  6. 方法返回指令则是根据返回值的类型区分的,包括有

    1. ireturn(当返回值是boolean、byte、char、short和int类型时使用)
    2. lreturn(long)、freturn(float)、dreturn(double)和areturn(reference)
    3. return指令供声明为void的方法、实例初始化方法、类和接口的类初始化方法使用

8 抛出异常指令

athrow

还可以参考这里给出的详细指令码说明http://blog.csdn.net/lm2302293/article/details/6713147


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
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社区 版权所有