jvm之字节码指令

jvm指令由一个字节长度,代表某个特定操作含义的数字(操作码)以及操作所需参数(操作数)构成。

字节码指令集

此处输入图片的描述 opcode代表支持的操作,其他列表示支持的操作类型

加载和存储指令

用于将数据在栈帧中局部变量表和操作数栈之间来回传输,将局部变量加载到操作栈;将数值从操作栈存储到局部变量表;将常量加载到操作数栈

运算指令

用于对两个操作数栈上值进行特定运算,并把结果存入操作数栈顶。分为整形数据运算指令和浮点数运算指令,对于byte,short,char,boolean等类型算术指令都使用int类型指令进行代替

类型转换指令

用于将两种不同数值类型进行相互转换,多用于代码中的显式类型转换,jvm对小范围向大范围类型转换直接支持;反之,大类型向小类型必须使用转换指令,而且可能会丢失精度

对象创建与访问指令

用于对类实例和数组创建,访问和操作

操作数栈管理指令

用于直接操作操作数栈的指令,出栈,入栈等

控制转移指令

用于让jvm有条件或无条件从指定位置指令执行程序

方法调用和返回指令

用于方法调用(分派,执行过程)和返回值,

异常处理指令

程序运行时抛出异常操作都由athrow指令实现

同步指令

jvm支持方法级方法内部一段指令序列的同步,通过monitor支持;当方法调用时, 调用指令检查方法常量池的方法表中的访问标志获取ACC_SYNCHRONIZED是否被覆盖,如果设置,执行现场要求被获取该monitor,然后才能执行方法,最好当方法完成时释放monitor, 其他线程进行竞争。java中主要使用synchronized修辞的语句块表示,指令对应有monitorenter和monitorexit两条指令支持。实现synchronized关键字需要编译器和jvm共同完成,编译器保证在经过编译后的代码无论以何种方式完成, 次序执行,monitorenter指令后都必须执行monitorexit指令,这就是happened-before原则