java字节码

  我们都知道Java字节码是JVM所使用的指令集。java字节码可以分为如下几类:

操作数栈

  Java 方法的栈桢分为操作数栈和局部变量区。通常来说,程序需要将变量从局部变量区加载至操作数栈中,进行一番运算之后再存储回局部变量区中。操作数栈的指令有如下:

  • dup 复制栈顶元素(常用于复制 new 指令所生成的未经初始化的引用。)如下代码生所的字节码:
    5796101-b44521edbd05bf8d.png
    dup
  • pop 指令常用于舍弃调用指令的返回结果。当调用了有返回值的方法却不用返回值时需要有个pop指定,如下图所示:
    5796101-6bc917d22d2d128e.png
    pop
  • iconst,lconst, fconst, dconst, aconst, bipush, sipush,可以将不同类型的常量加载到操作数栈中。这几个指令的操作范围与类型如下表:
指令类型范围
iconstint(boolean, byte, char, short)[-1, 5]
lconstlong0, 1
fconstfloat0, 1,2
dconstdouble0, 1
dconstreferencenull
bipushint(boolean, byte, char, short)[-128,127]
sipushint(boolean, byte, char, short)[-32768,32767]

代码与指令的对应关系如下图所示:
5796101-884a9983404c6c04.png
指令对应图
  • ldc 加载常量池中的常量值。
    5796101-965b7c84c12b2056.png
    Idc加载常量池中的例子
  • 将局部变量区的值加载到操作数栈的指令
      Java 虚拟机将局部变量区当成一个数组,依次存放 this 指针(仅非静态方法),所传入的参数,以及字节码中的局部变量。存储在局部变量区的值,通常需要加载至操作数栈中,方能进行计算,得到计算结果后再存储至局部变量数组中。这些加载、存储指令如下表所示:

类型加载指令存储指令
int(boolean, byte, char, short)iloadistore
longlloadlstore
floatfloadfstore
doubledloaddstore
referencealoadastore
5796101-591ec30f42adea13.png
局部变量表的字节码
  • iinc M, N指令,(其中 M为正整数,N为整数),用于操作局部变量区。表求的含义为:将局部变量数组的第 M 个单元中的 int 值增加 N,常用于 for 循环中自增量的更新。字节码如下图所示:
    5796101-b4b772243caf271d.png
    iinc例子
Java 相关指令
  • new: 后跟目标类,生成该类的未初始化的对象。
  • instanceof:后跟目标类,判断栈顶元素是否为目标类 / 接口的实例。是则压入 1,否则压入 0。如图所示:
    5796101-2838911f1beb93d3.png
    instanceof
  • checkcast:后跟目标类,判断栈顶元素是否为目标类 / 接口的实例。如果不是便抛出异常
  • athrow:将栈顶异常抛出
  • monitorenter/monitorexit 为栈顶对象加解锁。如下图所示:
    5796101-64d2e84cbf975b8e.png
    monitorenter、monitorexit
  • getstatic、putstatic用于访问静态字段。
  • getfield、putfield用于访问实例子段。
    5796101-bf49fe71e3d78bbe.png
    getfield、getstatic
数组相关指令
  • newarray:新建基本类型数组。
  • anewarray:新建引用类型数组
  • multianewarray :生成多维数组
  • arraylength: 求数组的长度。
    数组相关的加载与存储指令如下表:
类型加载指令存储指令
byte(boolean)baloadbastore
charcaloadcastore
shortsaloadsastore
intialoadiastore
longlaloadlastore
floatfaloadfastore
doubledaloaddastore
referenceaaloadaastore
5796101-3783f5815eb0585b.png
image.png
返回值相关指令

根据不同的返回类型,有不同的指令。如下表所示:

返回类型返回指令
voidreturn
int(boolean, byte, char, short)ireturn
longlreturn
floatfreturn
doubledreturn
referenceareturn
其它
  • goto:无条件跳转指令
  • tableswitch 和 lookupswtich:tableswitch针对密集的 cases,lookupswtich针对稀疏的 cases。


    5796101-e5db11ec7a11a0d5.png
    goto、switch指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值