继上一篇字节码分析finally块对return返回值的影响,好多人对局部变量表和操作数栈之间的关系搞不清楚,下面通过图解来描述局部变量表和操作数栈直接的关系。

通过下面这段代码来解释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和staticCode:stack=2, locals=3, args_size=2     //操作数栈深度为2,本地变量表容量为3,参数个数为20: 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     //返回栈中数字30LineNumberTable:line 5: 0       //代码第5行对应字节码第0行line 6: 2       //代码第6行对应字节码第2行line 7: 6       //代码第7行对应字节码第6行LocalVariableTable:Start  Length  Slot  Name   Si0       8     0     a   I    //a占用第1个solt0       8     1     b   I    //b占用第2个solt2       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

本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8    
点击这里快速进入简书

JVM基于栈的解释器执行原理相关推荐

  1. python解释器工作原理_Python解释器执行原理

    Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码), 然后再由Python Virtual Machine(Python虚拟机)来执行这些编译好的byt ...

  2. jvm(8)-虚拟机字节码执行引擎

    [0]README 0.1)本文转自 "深入理解jvm",旨在学习 虚拟机字节码执行引擎 的基础知识: [1]概述 1)物理机和虚拟机的执行引擎: 物理机的执行引擎是直接建立在处理 ...

  3. java虚拟机基于栈,深入理解java虚拟机(11):基于栈的字节码解释执行引擎

    1.解释执行 编译过程如下 2.基于栈的指令集和基于寄存器的指令集 java编译器输出的指令流,基本是一种基于栈的指令集架构,指令流中的大部分指令都是零地址,依赖于操作数工作.与之相对的是基于寄存器的 ...

  4. python虚拟机 基于寄存器_虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩...

    转载:http://rednaxelafx.iteye.com/blog/492667 大前天收到一条PM: 引用 你好,很冒昧的向你发短消 息,我现在在看JS引擎,能过看博客发现你对js engin ...

  5. java栈属于哪个代,Java 代码执行原理

    原标题:Java 代码执行原理 西安鸥鹏it教育将在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行 ...

  6. jvm虚拟机 基于栈_守护基于JVM的应用程序

    jvm虚拟机 基于栈 部署体系结构设计是任何定制服务器端应用程序开发项目的重要组成部分. 由于其重要性,部署架构设计应尽早开始,并与其他开发活动一起进行. 部署体系结构设计的复杂性取决于许多方面,包括 ...

  7. jvm的架构模型:基于栈式的架构和基于寄存器架构的特点

    基于栈的架构设计,指令数量更多,但指令集小

  8. 阿里P8架构师谈:JVM的内存分配、运行原理、回收算法机制

    不管是BAT面试,还是工作实践中的JVM调优以及参数设置,或者内存溢出检测等,都需要涉及到Java虚拟机的内存模型.内存分配,以及回收算法机制等,这些都是必考.必会技能. JVM内存模型 JVM内存模 ...

  9. 虚拟机(基于栈还是基于寄存器)之谈

    原文章地址:http://rednaxelafx.iteye.com/blog/492667 1.解析器与解释器 解析器是parser,而解释器是interpreter.两者不是同一样东西,不应该混用 ...

最新文章

  1. angular4 下载文件 Excel zip包
  2. c语言给定变量a的初始值,2018年9月计算机二级C语言考试冲刺提分试题(一)
  3. android开发超级群(500人)
  4. Jenkins入门系列之——03PDF文档下载
  5. 计算机辅助制造期末试题答案,精编国家开放大学电大本科《机械CAD-CAM》2025期末试题及答案(试卷号:1119)...
  6. 对网易云音乐软件的看法
  7. 用vim写python代码的两个关键设置
  8. windows系统c语言编译器安装
  9. 计算机网络自顶向下方法第七版第六章答案,《计算机网络 自顶向下方法》(第7版)答案(第六章)(一)...
  10. JS生成二维码,以下介绍3种方法
  11. DllMain函数参数简介
  12. 全国大学生信息安全竞赛writeup--暗号(reverse300)
  13. 高数笔记(十七):二重积分的概念、性质与计算,三重积分的概念、性质与计算
  14. Android 各版本对应的SDK版本
  15. 循环冗余校验-CRC
  16. 如何通过golang 连接阿里云的redis实例(golang带账号密码访问redis)
  17. java 定义一个rectangle类,Java定义一个Rectangle类
  18. 万字报告!一文看懂全球车厂的技术家底模块化平台
  19. 记一次linux redhat 7.4 maipo单用户模式恢复文件
  20. 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表

热门文章

  1. docker搭建redis
  2. NLP神器—Gensim
  3. 网页拉起QQ进行交谈
  4. 人脸静默活体检测最新综述
  5. CVPR 2020 | 自适应聚合网络AANet:更高效的立体匹配
  6. 知乎高赞回答:是否有必要系统学习概率图模型?
  7. java第五章抽象类与接口5.1-5.3 2020.3.27+31
  8. centos 6.5安装mysql5.7,centos6.5安装mysql5.7
  9. android获取apk名称_安卓逆向——APK安装流程
  10. VSCode生成.vue模版