现代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    //弹出当前操作数栈顶元素,将值压到调用者的操作数栈中。当前操作数栈的所有元素都将被丢弃。

本地变量表如下图

基于栈的指令集与基于寄存器的指令集的区别,JVM指令集实例的更多相关文章

  1. 基于栈的指令集与基于寄存器的指令集详细比对及JVM执行栈指令集实例剖析

    基于栈的指令集与基于寄存器的指令集详细比对: 这次来学习一些新的概念:关于Java字节码的解释执行的一种方式,当然啦是一些纯理论的东东,但很重要,在之后会有详细的实验来对理论进行巩固滴,下面来了解一下 ...

  2. JVM笔记 -- JVM的发展以及基于栈的指令集架构

    2011年,JDK7发布,1.7u4中,开始启用新的垃圾回收器G1(但是不是默认). 2017年,发布JDK9,G1成为默认GC,代替CMS.(一般公司使用jdk8的时候,会通过参数,指定GC为G1) ...

  3. jvm 字节码执行 (二)动态类型支持与基于栈的字节码解释执行

    动态类型语言 动态类型语言的关键特征是它的类型检查的主体过程是在运行期而不是编译期. 举例子解释“类型检查”,例如代码: obj.println("hello world"); 假 ...

  4. Nagios Core/Icinga 基于栈的缓冲区溢出漏洞

    漏洞名称: Nagios Core/Icinga 基于栈的缓冲区溢出漏洞 CNNVD编号: CNNVD-201402-484 发布时间: 2014-03-03 更新时间: 2014-03-03 危害等 ...

  5. [原创]基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程

    基于Zynq PS与PL之间寄存器映射 Standalone & Linux 例程 待添加完善中

  6. C#编程(七十六)----------使用指针实现基于栈的高性能数组

    使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; u ...

  7. 基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

    也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们 ...

  8. Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)

    Off-By-One 漏洞 (基于栈) 原文地址:https://bbs.pediy.com/thread-216954.htm 什么是off by one? 将源字符串复制到目标缓冲区可能会导致of ...

  9. JVM--a == (a = b)基于栈的解释器执行过程

    前言 在翻阅ConcurrentLinkedQueue的代码的时候,发现这样一段代码在JDK源码中总是出现. t != (t = tail) 原先总是以为这不就是 t != t ?很是纳闷,遂Demo ...

随机推荐

  1. C# is与 java instanceof 作用相同

    c#中 is 检查对象是否与给定类型兼容. 例如,下面的代码可以确定对象是否为 MyObject 类型的一个实例,或者对象是否为从 MyObject 派生的一个类型: if (obj is MyObj ...

  2. php工具、拓展下载地址

    php工具.拓展下载地址 php各版本下载地址: https://windows.php.net/downloads/releases/archives/ php_redis 下载地址 windwos ...

  3. vue中8种组件通信方式, 值得收藏!

    vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要,那么组件之间如何进行数据通信的呢? 首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易理解他们的通信方式, 就 ...

  4. ISCC之msc5他们能在一起吗?

    如题,开始分析,附件是一个二维码,读出来一串base64 拿去解密,PASS{0K_I_L0V3_Y0u!} 提交几次不对, 继续hxd分析图片,最后在文件末尾发现一个txt 修改后缀,是加密的, 拿 ...

  5. 微博MySQL优化之路

    数据库是所有架构中不可缺少的一环,一旦数据库出现性能问题,那对整个系统都回来带灾难性的后果.并且数据库一旦出现问题,由于数据库天生有状态(分主从)带数据(一般还不小),所以出问题之后的恢复时间一般不太 ...

  6. python高级特性-迭代

    概述 for  v   in d.values(): for k,v  in d.items(): for  a    in 'adfa': #判断对象是否可迭代 from collections i ...

  7. 51nod 2486 小b和矩阵

    小b有一个m行n列的矩阵. 她会从(1,1)开始,顺时针螺旋访问该矩阵,每个元素恰好被访问一次. 请你按小b的访问顺序输出每个元素. 收起   输入 第一行输入两个数m和n,其中0<m,n≤50 ...

  8. 快速开平方取倒数的算法--嵌入式ARM转载

    #include<stdio.h> #include<string.h> #include <stdlib.h> /* atof */ /* 计算=1/sqrt(n ...

  9. Restful API 指南

    作为软件开发人员,我们大多数人在日常生活中使用或构建 REST api.API 是系统之间的默认通信方式.亚马逊是如何有效地使用 api 进行通信的最佳例子. 在这篇文章中,我将讨论如何更好地设计 R ...

  10. 洛谷 P2401 不等数列 题解

    每日一题 day25 打卡 Analysis dp[i][j]=dp[i-1][j-1]*(i-j)+dp[i-1][j]*(j+1); 其中i和j是表示前i个数中有j个小于号,j<=i-1 要 ...