• 基于栈的指令集与基于寄存器的指令集的区别,JVM指令集实例


    现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行两者结合起来
    所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令。
    所谓编译执行,就是通过即时编译器(Just In Time,JIT) 将字节码转为本地机器码来执行;现代JVM会根据代码热点来生成相应的本地机器码。

    基于栈的指令集与基于寄存器的指令集直接的关系
    1、JVM执行指令时所采取的方式是基于栈的指令集
    2、基于栈的指令集主要的操作有入栈与出栈两种。
    3、基于栈的指令集的优势在于它可以在不同平台之间进行移植,而基于寄存器的指令集是与硬件架构紧密关联的,无法做到可移植。
    4、基于栈的指令集的缺点在于完成相同的操作,指令数量通常要比基于寄存器的指令集数量要多;基于栈的指令集是在内存中完成操作的,
    而基于寄存器的指令集是直接由CPU来执行的,它是在高速缓冲区进行执行的,速度要快很多。虽然虚拟机可以采用一些优化手段,
    但总体来说,基于栈的指令集的执行速度要慢一些。

    如对数字2-1的操作,基于栈和基于寄存器的区别

    基于栈的指令
    1.iconst_1 //将减数1压入栈顶
    2.iconst_2 //将被减数2压入栈顶
    3.isub //将栈中最上面的两个元素(2和1)弹出来,执行2-1的操作,将2-1的结果1压入栈顶
    4.istore_0 //将1放入局部变量表的第0个位置上。


    基于寄存器
    mov 将2放入寄存器,
    sub 后面跟一个参数1,在现有的寄存器上减去1,在把结果放回寄存器。

    JVM指令集实例

    创建MyTest8.java类

    public class MyTest8 {
    
        public int myCalculate(){
            int a = 1;
            int b = 2;
            int c = 3;
            int d = 4;
            int result = (a + b - c) * d;
            return  result;
        }
    }
    

      使用jclasslib查看myCalculate方法

    这21条指令就是myCalculat方法的操作步骤

    0 iconst_1   //将1放入操作数栈顶
    1 istore_1   //弹出操作数栈顶元素,并把元素的值复制到本地变量表索引为1的位置。
    2 iconst_2   //将2放入操作数栈顶
    3 istore_2   //弹出操作数栈顶元素,并把元素的值复制到本地变量表索引为2的位置。
    4 iconst_3   //将3放入操作数栈顶
    5 istore_3   //弹出操作数栈顶元素,并把元素的值复制到本地变量表索引为3的位置。
    6 iconst_4   //将4放入操作数栈顶
    7 istore 4     //弹出操作数栈顶元素,并把元素的值复制到本地变量表索引为4的位置。
    9 iload_1     //从本地变量表中索引为1的值压入操作数栈
    10 iload_2   //从本地变量表中索引为2的值压入操作数栈
    11 iadd  //弹出操作数栈最上层的两个元素,进行加操作(1+2),将结果3压入操作数栈
    12 iload_3   //从本地变量表中索引为3的值压入操作数栈
    13 isub        //弹出操作数栈最上层的两个元素,进行减操作(3-3),将结果0压入操作数栈
    14 iload 4    //从本地变量表中索引为4的值压入操作数栈
    16 imul       //弹出操作数栈最上层的两个元素,进行乘法操作(0 * 4),将结果0压入操作数栈
    17 istore 5    //弹出操作数栈顶元素,并把元素的值复制到本地变量表索引为5的位置。
    19 iload 5    //从本地变量表中索引为5的值压入操作数栈
    21 ireturn    //弹出当前操作数栈顶元素,将值压到调用者的操作数栈中。当前操作数栈的所有元素都将被丢弃。

    本地变量表如下图

  • 相关阅读:
    SpringBoot集成Redis
    独享锁 & 共享锁
    公平锁与非公平锁
    如何上传本地代码到码云
    SpringBoot+Mybatis+Pagehelper分页
    SpringBoot集成Mybatis(0配置注解版)
    高并发下接口幂等性解决方案
    SpringBoot全局配置文件
    干货
    Spring读取外部的资源配置文件—@PropertySource和@Value实现资源文件配置
  • 原文地址:https://www.cnblogs.com/linlf03/p/11109479.html
Copyright © 2020-2023  润新知