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

JVM学习笔记-----图解方法执行流程

原始java代码

package cn.itcast.jvm.t3.bytecode;/*** 演示 字节码指令 和 操作数栈、常量池的关系*/
public class Demo3_1 {public static void main(String[] args) {int a = 10;int b = Short.MAX_VALUE + 1;int c = a + b;System.out.println(c);}
}

常量池载入运行时常量池

由类加载器把main方法所在的类做类加载的操作,将class文件中的常量池的消息载入到运行时常量池中(运行时常量池属于方法区内的特殊区域)

方法字节码载入方法区

main线程开始运行,分配栈帧内存

                  局部变量表                         操作数栈

bipush 10

  • 将一个 byte 压入操作数栈(其长度会补齐 4 个字节),类似的指令还有
  • sipush 将一个 short 压入操作数栈(其长度会补齐 4 个字节)
  • ldc 将一个 int 压入操作数栈
  • ldc2_w 将一个 long 压入操作数栈(分两次压入,因为 long 是 8 个字节)
  • 这里小的数字都是和字节码指令存在一起,超过 short 范围的数字存入了常量池

istore_1

将操作数栈顶数据弹出,存入局部变量表的slot1

ldc #3

  • 从常量池加载 #3 数据到操作数栈
  • 注意 Short.MAX_VALUE 是 32767,所以 32768 = Short.MAX_VALUE + 1 实际是在编译期间计算好的

istore_2

执行a+b要在操作数栈中进行,执行引擎将局部变量表中a,b读取至操作数栈中

iload_1

iload_2

iadd

将俩弹出操作数栈,并将结果存入操作数栈

getstatic #4

从运行时常量池中的引用找到存在堆中的对象

iload_3

invokevirtual #5

  • 找到常量池 #5 项
  • 定位到方法区 java/io/PrintStream.println:(I) V 方法
  • 生成新的栈帧(分配 locals、stack 等)
  • 传递参数,执行新栈帧中的字节码

  • 执行完毕,弹出栈帧
  • 清除 main 操作数栈内容

return

  • 完成 main 方法调用,弹出 main 栈帧
  • 程序结束

从字节码角度分析 a++

package cn.itcast.jvm.t3.bytecode;/*** 从字节码角度分析 a++ 相关题目*/
public class Demo3_2 {public static void main(String[] args) {int a = 10;int b = a++ + ++a + a--;System.out.println(a);System.out.println(b);}
}
  • 注意 iinc 指令是直接在局部变量 slot 上进行运算
  • a++ 和 ++a 的区别是先执行 iload 还是 先执行 iinc

http://www.dtcms.com/a/327357.html

相关文章:

  • 百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行
  • 【力扣494】目标和
  • 【软考中级网络工程师】知识点之 IP QoS 技术
  • JVM宝典
  • 面试八股之从Java到JVM层面深入解析ReentrantLock实现原理
  • 力扣top100(day01-05)--矩阵
  • 开放原子开源生态大会:麒麟信安加入openEuler社区AI联合工作组,聚焦操作系统开源实践与行业赋能
  • Linux下的软件编程——文件IO
  • Openlayers基础教程|从前端框架到GIS开发系列课程(24)openlayers结合canva绘制矩形绘制线
  • 循环神经网络
  • THCV215一种高速视频数据收发器,采用低电压差分信号(LVDS)技术支持高速串行数据传输,支持1080p/60Hz高分辨率传输
  • 【[特殊字符][特殊字符] 协变与逆变:用“动物收容所”讲清楚 PHP 类型的“灵活继承”】
  • Gradle(二)Gradle的优势、项目结构介绍
  • 电商双11美妆数据分析(一)
  • Honeywell霍尼韦尔A205压力传感器HC41H106P060169419G固瑞克117764美国制造
  • Rust 项目编译故障排查:从 ‘onnxruntime‘ 链接失败到 ‘#![feature]‘ 工具链不兼容错误
  • KAQG:一种用于生成难度可控问题的知识图谱的增强的RAG系统(论文大白话)
  • 2025AI行业升级生态战:谁在“种树”?谁在“造林”?
  • 02-Ansible 基本使用
  • Visual Studio中VC++目录、C/C++和链接器配置的区别与最佳实践
  • Minst手写数字识别
  • python2操作neo4j
  • 非凸科技受邀参加Community Over Code Asia 2025 Rust分论坛
  • 上海AI实验室发布MinerU2:通专融合路线如何补齐AI-Ready数据的最后一公里
  • AutoAgent节点入门:解锁智能体的自主规划能力
  • Myqsl建立库表练习
  • 盲盒抽谷机小程序系统开发:解锁盲盒新玩法,开启潮玩社交新时代
  • 论答题pk小程序软件版权的
  • DeepSeek-R1与RAGflow本地部署全流程指南:从模型下载到个人知识库构建实战
  • 真实案例 | 如何用iFlyCode开发Webpack插件?