实战JAVA虚拟机 JVM故障诊断与性能优化(十)---字节码的执行

  字节码执行是java虚拟机的重点,就如同汇编语言对于计算机一样重要,字节码对于java虚拟机来说是执行的根本。

执行的基础:Java虚拟机常用指令介绍

  常用入栈指令:将常数压入操作数栈,根据数据类型和入栈内容不同,又可以分为const系列、push系列、ldc系列

    bipush (8位),sipush (16位)

    ldc,ldc_w,long或者double类型 ldw2_w指令

  局部变量压栈指令:将给定的局部变量表中的数据压入操作数栈:

    xload、xload_n、xaload

  出栈装入局部变量表指令

    xstore、xstore_n、xastore

  通用型操作

    NOP:和汇编中nop一样,表示什么都不做

    dup:duplicate复制,它会将栈顶元素复制一份并再次压入栈

    pop:把一个元素从栈顶弹出

  类型转换指令

    x2y:x可能是i,f,l,d,y,y可能是i,f,l,d,c,s,b,翻译分别是:

    实战JAVA虚拟机 JVM故障诊断与性能优化(十)---字节码的执行

  对象/数组操作指令

    1、创建指令

      new、newarray、anewarray、multianewarray

      new:用于创建普通对象

      anewarray:用于创建数组

      multianewarray:创建多维数组

    2、字段访问指令

      getfield、putfield:操作实例对象的字段

      getstatic、putstatic:操作类的静态字段

    3、类型检索指令

      checkacast:用于检查类型强制转换是否可以进行,如果可以,那么checkcast指令不会改变操作数栈,否则它会抛出ClassCastException异常

      instanceof:用于判断给定对象是否是某一个类的实例,它会将判断结果压入栈

    4、数组操作指令

      xastore,xaload

  比较控制指令

    1、比较指令

      dcmpg、dcmpl、fcmpg、fcmpl、lcmp

    2、条件跳转

      ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull

    3、比较条件跳转指令

      if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_icmpeq、if_acmpne

      以字母"i"开头的指令针对int整数操作(包括short和byte),以字符"a"开头的指令表示对象引用的比较。

    4、多条件分支跳转

      tableswitch:要求多个条件分支值是连续的

      lookupswitch:内部存放着各个离散的case-offset

    5、无条件跳转

      goto

  函数调用与返回指令

    invokevirtual:虚函数调用,调用对象的实例方法,支持多态

    invokeinterface:指接口方法的调用

    invokespecial:调用特殊的一些方法,比如构造函数、类的私有方法、父类方法。这些方法都是静态类型绑定的,不会在调用时进行动态派发

    invokestatic:调用类的静态方法

    invokedynamic:调用动态绑定的方法

同步控制

  Java虚拟机提供了monitorenter、monitorexit两条执行来完成临界区的进行和离开操作,