当前位置: 首页 > news >正文

JVM==>图解字节码指令

一,原始代码

我们来看一下执行这段代码的具体流程

那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中,交给CPU运行 

 1)常量池载入运行时常量池

我们发现 10 并没有被存入常量池中, 这是因为short范围以内的数字不会放到常量池中的, 直接进入存入方法区

short.MAX_VALUE = 32767

2)方法字节码载入方法区

3)main线程开始运行

根据常量池,方法区提供的信息,确定操作数栈深度为2,局部变量表的长度为4就足够用了, 避免浪费

4)执行引擎开始执行字节码 

 

 

 

getstatic #4. 表示获取System.out 的静态字段, 该静态字段的类型为java.io.PrintStream。该指令执行完成后,操作数栈顶存放的就是System的out静态字段的引用

iload3 把局部变量表第3个位置的元素加载到操作数栈上

注意: 下图堆上没有这个System.out对象, 图错了

执行完成后,弹出println栈帧,并清空main操作数栈

5)return操作

最后return 操作, 弹出main栈帧

 二, 经典问题i++

首先说一下,       不管是 i++ 还是++i, 都是首先对局部变量表上的那个值进行自增 其次再返回i, 但是区别在于, i++ 是返回操作数栈上的值, ++i 是返回局部变量表上的值

iinc 1,1

第二个iinc 1,1  这个就是第二a在++

 

执行iload_1.    准备做第一次+

 

第2次 + 

  

 

http://www.lryc.cn/news/252657.html

相关文章:

  • MISRA C 2012 标准浅析
  • Redis高可用之Sentinel哨兵模式
  • AI “自主运行”的计算机概念正逐渐成为现实
  • 数据库系统概论期末经典大题讲解(用关系代数进行查询)
  • 算法通关村第十六关-黄金挑战滑动窗口与堆的结合
  • 基于jsp的搜索引擎
  • 【Altium designer 20】
  • Proteus仿真--基于1602LCD与DS18B20设计的温度报警器
  • Clickhouse Join
  • Arduino驱动STS35数字温度传感器(温湿度传感器)
  • 一起学docker系列之十八Docker可视化工具 Portainer:简介与安装
  • 【数据结构】线段树
  • 王道数据结构课后代码题p175 06.已知一棵树的层次序列及每个结点的度,编写算法构造此树的孩子-兄弟链表。(c语言代码实现)
  • filter过滤器
  • MES物料的动态批次管理漫谈
  • 【爬虫逆向分析实战】某笔登录算法分析——本地替换分析法
  • vue3使用动态component
  • 单机游戏推荐:巨击大乱斗 GIGABASH 中文安装版
  • 计算机系统启动过程
  • DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
  • 【开发问题解决方法记录】03.dian
  • QT之QString
  • 常见的几种计算机编码格式
  • 3D旋转tab图
  • openGL 三:矩阵和向量
  • Socket和Http的通讯原理,遇到攻击会受到哪些影响以及如何解决攻击问题。
  • 【springboot】整合redis
  • 回溯和分支算法
  • 深入理解:指针变量的解引用 与 加法运算
  • Docker 镜像构建的最佳做法