通过下面这段代码来解释JVM基于栈的执行原理

4. public static int add(int a, int b) {
5. int c = 0;
6. c = a + b;
7. return c;
8. }

查看字节码的命令:javap -verbose ByteCode.class

add方法的字节码如下:

 public static int add(int, int);
descriptor: (II)I //描述方法参数为两个int类型的变量和方法的返回类型是int的
flags: ACC_PUBLIC, ACC_STATIC //修饰方法public和static
Code:
stack=2, locals=3, args_size=2 //操作数栈深度为2,本地变量表容量为3,参数个数为2
0: iconst_0 //将int值0压栈
1: istore_2 //将int值0出栈,存储到第三个局部变量(slot)中
2: iload_0 //将局部变量表中第一个变量10压栈
3: iload_1 //将局部变量表中第一个变量20压栈
4: iadd //将操作数栈顶两个int数弹出,相加后再压入栈中
5: istore_2 //将栈顶的int数(30)弹出,存储到第三个局部变量(slot)中
6: iload_2 //将局部变量表中第三个变量压栈
7: ireturn //返回栈中数字30
LineNumberTable:
line 5: 0 //代码第5行对应字节码第0行
line 6: 2 //代码第6行对应字节码第2行
line 7: 6 //代码第7行对应字节码第6行
LocalVariableTable:
Start Length Slot Name Si
0 8 0 a I //a占用第1个solt
0 8 1 b I //b占用第2个solt
2 6 2 c I //c占用第3个solt
 

根据上面字节码画出下面局部变量表和操作数栈之间的操作关系。

 
局部变量表和操作数栈关系

图中调用add(10,20)传入的参数是a=10;b=20。

  1. 指令0执行后:局部变量表中有两个数字10、和20,操作数栈一个值0,程序计数器指向第0行字节码指令
    0: iconst_0 //将int值0压栈
  2. 指令1执行后:局部变量表中有三个数字10、20和0,操作数栈没有值,程序计数器指向第1行字节码指令
    1: istore_2 //将int值0出栈,存储到第三个局部变量(slot)中
  3. 指令2执行后:局部变量表中有三个数字10、20和0,操作数栈一个值10,程序计数器指向第2行字节码指令
    2: iload_0 //将局部变量表中第一个变量10压栈
  4. 指令3执行后:局部变量表中有三个数字10、20和0,操作数栈两个值10和20,程序计数器指向第3行字节码指令
    3: iload_1 //将局部变量表中第一个变量20压栈
  5. 指令4执行后:局部变量表中有三个数字10、20和0,操作数栈一个值30,程序计数器指向第4行字节码指令
    4: iadd //将操作数栈顶两个int数弹出10和20,相加后再压入栈中
  6. 指令5执行后:局部变量表中有三个数字10、20和30,操作数栈没有值,程序计数器指向第5行字节码指令
    5: istore_2 //将栈顶的int数(30)弹出,存储到第三个局部变量(slot)中
  7. 指令6执行后:局部变量表中有三个数字10、20和30,操作数栈一个值30,程序计数器指向第6行字节码指令
    6: iload_2 //将局部变量表中第三个变量压栈
  8. 指令7执行后:将栈中的数字返回给调用方法,并销毁此栈帧
    7: ireturn //返回栈中数字30

JVM基于栈的解释器执行原理的更多相关文章

  1. jvm | 基于栈的解释器执行过程

    一段简单的算术代码: public class Demo { public static void main(String[] args) { int a = 1; int b = 2; int c ...

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

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

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

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

  4. JVM学习(五) -执行子系统

    虚拟机和物理机的区别.两种都有代码执行能力.物理机的执行引擎是建立在处理器.硬件.指令集和操作系统上.而虚拟机的执行引擎是有自己实现的.因此可以自行的制定指令集和执行引擎的结构关系. 个人理解:分为三 ...

  5. 【JVM】虚拟机字节码执行引擎

    概念模型上,典型的帧栈结构如下(栈是线程私有的,也就是每个线程都会有自己的栈).                     典型的帧栈结构 局部变量表 存放方法参数和方法内部定义的局部变量.在编译阶段, ...

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

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

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

    现代JVM在执行Java代码的时候,通常都会将解释执行与编译执行两者结合起来 所谓解释执行,就是通过解释器来读取字节码,遇到相应的指令就去执行该指令. 所谓编译执行,就是通过即时编译器(Just In ...

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

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

  9. (4.1)Spring MVC执行原理和基于Java的配置过程

    一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...

随机推荐

  1. luogu P3645 [APIO2015]雅加达的摩天楼 分块 根号分治

    LINK:雅加达的摩天楼 容易想到设\(f_{i,j}\)表示第i个\(doge\)在第j层楼的最小步数. 转移显然是bfs.值得一提的是把初始某层的\(doge\)加入队列 然后转移边权全为1不需要 ...

  2. C#LeetCode刷题-堆

    堆篇 # 题名 刷题 通过率 难度 23 合并K个排序链表   39.4% 困难 215 数组中的第K个最大元素   51.5% 中等 218 天际线问题   32.9% 困难 239 滑动窗口最大值 ...

  3. C#LeetCode刷题之#443-压缩字符串​​​​​​​(String Compression)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3943 访问. 给定一组字符,使用原地算法将其压缩. 压缩后的长度 ...

  4. C#LeetCode刷题之#441-排列硬币(Arranging Coins)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3995 访问. 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状 ...

  5. C#LeetCode刷题之#122-买卖股票的最佳时机 II(Best Time to Buy and Sell Stock II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4032 访问. 给定一个数组,它的第 i 个元素是一支给定股票第  ...

  6. C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3736 访问. 给定一个包含了一些 0 和 1的非空二维数组 gr ...

  7. 认识与学习BASH①——鸟叔的Linux私房菜

    文章目录 认识与学习BASH① 认识BASH 壳程序 多种shells Bash shell 的功能 type :查询指令是否为Bash shell 的内置指令 指令的换行输入和快速删除 Shell的 ...

  8. for语句——猜数字

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib. ...

  9. 初始JAVA第十五章String的总结

    字符串的概述 1.什么是字符串:零个或多个字符组成的有限序列 2.如何使用字符串:(使用字符串分为两步) 1)定义并初始化字符串 2)使用字符,对字符串进行一些处理 // 穿件一个字符串 // 语法 ...

  10. day5 字符串 函数

    字符串 1.单引号,双引号,三引号括起来的都是字符串    索引  从0开始  str[0]    遍历   for循环    判断字符串中是否都是数字    ,字母  返回bool型         ...