理解JVM栈帧

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栈帧
用两个代码来帮助理解。
  public static void main(String[] args) {    int i = 8;
    i = i++;
    System.out.println(i);
  }
  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;
 
以上是 理解JVM栈帧 的全部内容, 来源链接: utcz.com/z/515235.html

