现在的位置: 首页 > 综合 > 正文

JVM 指令集与 X86 等真实cpu指令集的异同

2018年04月19日 ⁄ 综合 ⁄ 共 1301字 ⁄ 字号 评论关闭
-------
android培训
java培训、期待与您交流! ----------

1.函数调用指令集

x86 cpu 函数调用指令集 call ret 主要作用是保存现场和恢复现场,比如 cpu 寄存器压栈和弹栈;

jvm 函数调用指令集 invokevirtual invokeinterface invokespecial invokestatic return .. 等等,由于 jvm 没有物理寄存器,而是用操作数栈和pc寄存器来替代,jvm 保存现场和恢复现场的解决方案是压一个栈帧 入 java栈,函数返回的时候弹出从 java栈中弹出一个栈帧;因为 java 的代码是以类中的函数为单位进行代码块的管理,所以调用函数的时候,jvm 不能和 x86 一样,直接跳转就能找到对应的代码块,而 jvm 需要一些列根据对象、类、结构、函数等相关数据单元提供的引用信息来查找要调用的函数的对应的代码块在那里。并且这个特性造成
jvm 中的跳转等指令只能函数内跳转,并且一个函数的代码是用 code[] 来管理,跳转需要地址只需要是这个 code[] 的索引。

2,.数据交换

jvm 内部数据存储区,大概可以分为 操作数栈、局部变量表、java 堆、方法区中类的常量池,而 x86 等 cpu 一般有 cpu 内部的寄存器、内存的数据区、内存中的栈、内存中的代码段等地方,jvm 的所有运算只能在 操作数栈 中进行( iinc 指令除外,他们可以直接对局部变量进行运算), x86 cpu 所有的运算只能在 cpu 内部寄存器中进行,所以除了这些部件之间的必要的数据交换,所有要运算的数据也必须转移到 jvm 操作数栈、x86 cpu 寄存器 然后才能进行运算,之后再把结果转移回去。

jvm 为 操作数栈 和 局部变量表 之间数据交换设计了专门的指令,比如:iload istore lload lstore fload fstore dload dstore ldc bipush 等等;jvm 为 java堆中的对象的字段 和 jvm操作数栈 之间的数据交换设计了 getfeild putfeild 指令,为类中的字段和操作栈数据交换设计了 getstatic putstatic 指令,为堆中的数组和操作栈数据交换设计了 baload bastore caload castore ...
 ,获取堆中数组的长度指令 arraylength。

3.运算指令集

jvm 和运算相关的指令集主要有 算术运算、位运算、比较指令,jvm 还为各种基本类型提供的运算提供不同的操作码; x86 也有算术运算、逻辑运算、位运算、比较指令,但是所有的操作都是直接针对寄存器中的二进制数据进行,不区分数据类型。

4.控制转移指令

jvm 和 x86 相比,主要增加了对 switch 这种多分支跳转的直接支持,所以在 java 中,对于多分支来说,使用 switch 比 if...else 效率要高。

4.类型转换指令

jvm 还提供了 窄化类型转换 指令,宽化类型转换时 jvm 内嵌支持的。

5.对象创建指令

new

6.抛出异常指令

athrow

7.同步指令

jvm 提供了 monitorenter、monitorexit  进入管程 和 退出管程指令来实现同步;x86 cpu只是提供 swap 这种内存数据交换指令来给实现原子操作提供支持。

如有转载请标明原文链接

抱歉!评论已关闭.