通过下面这段代码来解释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 P2354 [NOI2014]随机数生成器 贪心 卡空间 暴力

    LINK:随机数生成器 观察数据范围还是可以把矩阵给生成出来的. 考虑如何求出答案.题目要求把选出的数字从小到大排序后字典序尽可能的小 实际上这个类似于Mex的问题. 所以要从大到小选数字 考虑选择一 ...

  2. python金融大数据分析PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:7k4b 内容简介 唯一一本详细讲解使用Python分析处理金融大数据的专业图书:金融应用开发领域从业人员必读. Python凭借其简单.易读.可扩展性以及拥有巨大而活跃的科学计算社区 ...

  3. 什么是Cookie、Session、Token?

    原文:https://mp.weixin.qq.com/s/pWXhI_ppKhtOP-Xf_SpuDA 来源:后厂村码农 在了解这三个概念之前我们先要了解 HTTP 是无状态的Web服务器,什么是无 ...

  4. 【SDOI2010】猪国杀 题解(模拟)

    前言:嗅到了一丝头秃的味道…… ------------------ 题目链接 题目实在太长,变量也很多.建议至少读个三五遍再做题.不要忽略任何细节,不要想当然.(因为真正玩三国杀肯定不像猪一样出牌啊 ...

  5. Java分层领域模型的DO、DTO、BO、AO、VO、POJO、Query定义

    分层领域模型:    DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象.    DTO( Data Transfer Object):数据传输对象,Servic ...

  6. URLDecoder异常解决方法

    URLDecoder对参数进行解码时候,代码如: URLDecoder.decode(param,"utf-8"); 有时候会出现类似如下的错误: URLDecoder异常Ille ...

  7. 15、Facade 外观模式

    什么是Facade模式 随着系统越来越复杂,我们需要把细节隐藏起来,给客户端提供一个统一的接口.在这种需求下facade模式诞生了.该模式比较简单,我们只需要在系统变得复杂把它运用上来,这样底层跟客户 ...

  8. 伸展树(Splay)学习笔记

    二叉排序树能够支持多种动态集合操作,它可以被用来表示有序集合,建立索引或优先队列等.因此,在信息学竞赛中,二叉排序树应用非常广泛. 作用于二叉排序树上的基本操作,其时间复杂度均与树的高度成正比,对于一 ...

  9. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

  10. 手把手教你NLTK WordNet使用方法

    最近看了WordNet,0基础入门,简单记下笔记.因为本身不是学自然语言处理的,好多名词不是特别清楚,现有的博客读的晕乎乎,所以重新写了这个,理清思路.除了行文中提到的链接,其他几个有用的参考链接如下 ...