字节码指令概述

  • 1.基本介绍
  • 2.执行模型
  • 3.数据类型
  • 4.指令分类


1.基本介绍

  • Java字节码指令对于虚拟机,就好比汇编语言对于计算机,都属于基本执行指令。
  • Java字节码指令由一个字节长度的、代表着某种特定操作含义的数字(也称为操作码)以及跟随其后的0个或多个代表此操作所需的参数(也称为操作数)共同构成。
  • 由于JVM采用面向操作数栈而不是寄存器的结构,所以我们发现大多数的字节码指令都不包含操作数,只有一个操作码。
  • 由于Java字节码指令中操作码的长度为一个字节,也就意味着指令集的操作码总数不可能超过256个。
  • 一个指令,可以从局部变量表、常量池、堆中对象、方法调用、系统调用中等获取数据,然后将这些数据压入操作数栈。一个指令,也可以从操作数栈中取出数据,完成赋值、加减乘除、方法传参、系统调用等操作。

2.执行模型

如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当做最基本的执行模型来理解:

do{
    // 自动计算PC寄存器的值加1
    // 根据PC寄存器的指示位置,从字节码流中取出操作码
    // 判断字节码后面是否还有操作数,然后从字节码流中取出操作数
    // 执行操作码所定义的操作
}while(字节码长度>0);

3.数据类型

在Java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息,它们的对应关系大致有:

  • i代表int
  • l代表1ong
  • s代表short
  • b代表byte
  • c代表char
  • f代表float
  • d代表double

【注意】:也有一些字节码指令的操作码没有明确地指明它的数据类型,比如arraylength指令,它没有代表数据类型的特殊字符,但操作数永远只能是一个数组类型的对象。还有另外一些指令,比如无条件跳转指令goto,它们是与数据类型无关的。

【注意】:大部分的指令都没有支持整数类型byte、char、short或者boolean类型,但编译器会在编译期或运行期将byte和short类型的数据带符号扩展(Sign-Extend)为相应的int类型数据,将boolean和char类型数据零位扩展(Zero-Extend)为相应的int类型数据。与之类似,在处理 boolean、byte、short和char类型的数组时,也会转换为使用对应的int类型的字节码指令来处理。

4.指令分类

  • 加载与存储指令
  • 算术指令
  • 类型转换指令
  • 对象的创建与访问指令
  • 方法调用与返回指令
  • 操作数栈管理指令
  • 比较控制指令
  • 异常处理指令
  • 同步控制指令