奥达字节码指令简介 深入理解JVM搬运工(3)-nullPoint水

    字节码指令简介 深入理解JVM搬运工(3)-nullPoint水尊贵囚徒
    声明:本文基于《深入理解Java虚拟机》一书,可以看作是该书的读书笔记字节码指令简介
    Java虚拟机的指令是由一个字节长度的、代表着某种特定操作含义的数字(操作码Opcode)以及跟随其后的零至多个代表此操作所需参数(操作数Operands)而构成。由于java虚拟机采用面向操作数栈而不是寄存器的架构橙斧任务流程,所以大多数的指令都不含操作数邪恶召唤师,只有一个操作码罗晓韵。Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数最多只有256条。Class文件格式放弃了编译后代码的操作数长度对齐毛渝南。字节码与数据类型
    由于java虚拟机的操作码长度只有一个字节夜魅公寓,所以java并不是每种数据类型和每种操作都有对应的指令码,也就是说指令集是非完全独立的。大部分的指令都没有支持整数类型byte、har、hot甚至没有支持Boolean类型。编译器会在编译期或运行期将byte、short、Boolean、char转换为对应的int类型的字节码指令来处理。
    加载和存储指令
    加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输乌山云雨。包括以下几类:
    将一个局部变量加载到操作栈
    将一个数值从操作数栈存储到局部变量表
    将一个常量加载到操作数栈
    扩充局部变量表的访问索引的指令
    运算指令
    运算或算术指令用于对两个操作数栈上的值信息某种特定的运算凌慕华,并把结果重新存入到操作栈顶旦曲阿帝。大体分为两种:对整型数据进行运算的指令和对浮点型数据进行运算的指令夜半2点钟。运算指令如下
    加法指令
    减法指令
    乘法指令
    除法指令
    求余指令
    取反指令
    位移指令
    按位或指令
    按位与指令
    按位异或
    局部变量自增指令
    比较指令
    类型转换指令
    类型转化指令可以将两个不同的数值类型进行相互转换高岛佑,这些转换操作一般用于实现用户代码中的显示类型转换操作,或者用来处理字节码指令集中数据类型相关指令无法与数据类型一一对应的问题。
    Java虚拟机支持以下类型转换(大范围à小范围)无需显示的使用转换指令:
    int类型到long、float、double类型
    long类型到float、double类型
    float类型到double类型。
    数据类型窄化转换(小范围à大范围)必须显示使用转换指令完成,张炘炀窄化转换可能造成上限溢出、下限溢出、精度丢失等情况灵壶仙缘。
    对象创建与访问指令
    类实例和数组在java虚拟机中的创建和操作使用了不同的字节码指令夜栈。指令如下:
    创建类指令
    创建数组指令
    访问类字段和实例字段的指令
    把一个数组元素加载到操作数栈的指令
    把一个操作数栈的值存储到数组元素中的指令
    取数组长度的指令
    检查类实例类型的指令
    操作数栈管理指令
    操作数栈管理指令包括:
    将操作数栈的栈顶一个或两个元素出栈
    复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶
    将栈顶的两个数值互换
    控制转移指令
    控制转移指令是让java虚拟机有条件或无条件的从指定的位置指令而不是控制转移指令的下一条指令继续执行程序,可以认为控制转移治疗了就是在有条件或者无条件的修改PC寄存器的值纪欣妤。指令如下:
    条件分支
    复合条件分支
    无条件分支
    方法调用和返回指令
    方法调用指令如下:
    调用对象的实例方法
    调用接口的方法
    调用一些需要特殊处理的方法(初始化方法、私有方法、父类方法)
    调用类方法
    运行时动态解析调用点限定符所引用的方法
    异常处理指令
    在java虚拟机中,处理异常不是由字节码指令来实现的金智厚,而是采用异常表来完成。而在java程序中显示抛出异常的操作都是有athrow指令来实现的马招弟。
    同步指令
    Java虚拟机可以支持方法级同步和方法内部一段指令序列的同步3u8891,这两种同步结构都是使用管程来支持的奥达凶兽时代。方法级的同步是隐世的,即无需通过字节码指令来控制,它实现在方法调用和返回操作之中敬颂教安。同步一段指令集序列通常是由java语言中的synchronize语句块来标识的吴愤奋,java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchromized关键字的语义。