前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解 JVM Stack 栈帧 Frame

理解 JVM Stack 栈帧 Frame

作者头像
斯武丶风晴
发布2020-04-24 15:26:02
7190
发布2020-04-24 15:26:02
举报
文章被收录于专栏:龙首琴剑庐龙首琴剑庐

前置知识

  • JVM运行时数据区
  • 栈帧的组成

虚拟机栈 与 栈帧

虚拟机栈(JVM Stack),由 栈帧 Frame 组成。 Frame - 每个方法对应一个栈帧, 包括以下部分:

  • Local Variable Table (局部变量表)
  • Operand Stack(操作数栈) 操作数栈(Operand Stack)也常称为操作栈,它是一个后入先出(Last In FirstOut,LIFO)栈。 同局部变量表一样,操作数栈的最大深度也在编译的时候写入到Code属性的max_stacks数据项中。
  • Dynamic Linking(动态链接) 动态链接是一个将符号引用解析为直接引用的过程。
  • return address(返回地址) a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方 方法退出时会做的操作:
    • 恢复上一个方法(调用者的栈帧)的Local Variable Table(局部变量表)和Operand Stack(操作数栈)
    • 将返回的变量压入 上一个方法(调用者的栈帧)的Operand Stack(操作数栈)
    • 调整 Program Counter Register (PC, 程序计数器) 的值为 当前帧的返回地址
    • 当前栈帧弹出JVM Stack 栈,
    • 执行Program Counter Register (PC, 程序计数器)指向的指令

理解JVM栈帧

用两个代码来帮助理解。

代码语言:javascript
复制
  public static void main(String[] args) {
    int i = 8;
    i = i++;
    System.out.println(i);
  }
代码语言:javascript
复制
  public static void main(String[] args) {
    int i = 8;
    i = ++i;
    System.out.println(i);
  }

这里两个代码分别打印什么呢?

结果是 9 和 8 。 为什么呢??

我们使用字节码原语来解析一下。

这里用到我们的一个IDEA 插件: jclasslib Bytecode viewer

i= i++

  • 0 bipush
  • 2 istore_1 ---> int i = 8;
  • 3 iload_1
  • 4 iinc 1 by 1 --> 完成 i++
  • 7 istore_1 --> i = i++;

i = ++i

前面都是一样。 区别只在于 这个是先 iinc 1 by 1 后 iload_1

  • 6 iload_1 --> 完成 ++i
  • 7 istore_1 --> i = ++i;

by Sven Augustus https://my.oschina.net/langxSpirit

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前置知识
  • 虚拟机栈 与 栈帧
  • 理解JVM栈帧
  • i= i++
  • i = ++i
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档