栈的执行流程

 

 

 

bipush 将100 压栈

istore_1 将100 弹出到局部变量表索引为1的位置

return

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 sipushi 200 因为底层是btye 最多容纳127  若超出 是si200(short)转换为int 类型 压栈

istore_1 弹出到局部变量表中

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 参数 k 数存放在局部变量表的

sipush 300 将300压倒栈中

istore_2   局部变量表中有this  这就是我们能在方法中使用this 原因 因为this是在我们局部变量表中存在  只要不是static 方法  非static方法是需要对象的  这个方法的地址会在局部变量表中   为什么前面没有this ? 因为前面方法都是static方法

第0个位置是this  第一个位置是k  形参  第二个位置是i 局部变量

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

iload_1 因为是非静态方法  那么下标为0一定是this  下标为1 为 a  将a=3 压栈

iload_2 是b  将b=4压栈

iadd 拿出操作树栈中的两条指令 a和b (a和b 弹出栈) 执行相加 然后将结果扔回栈顶

istore_3 将7弹出 存入局部变量表下标为3的地方

return

 

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

m1 方法的指令:

  sipush 200 将200 压栈

  istore 将200 弹出到局部变量表的下标为1的位置

  return

 

main 方法局部变量表结构

args 0

h    1

  由于main方法调用了m1 方法 所以JVMstack 中有两个栈帧  一个是main方法栈帧   一个是m1 栈帧

 当main 方法运行到m1 方法的时候会先执行m1 方法  等m1 方法结束  m1 弹出栈 结束了 才会到main 方法继续运行  return address  找到下一个栈帧运行的地址

  new hello02 对象(new 对象的过程?)在堆内存中new出hello02 对象  这个对象的地址会压栈  这时候的值都是默认值

  dup  在栈顶复制这个地址

  invokespecial    执行空构造方法  执行构造方法的过程会将栈顶复制的地址弹出指向这个方法  这个对象里面的才会赋值初始值  这个对象才算构造完成

  但此时栈中还有一个地址指向这个构造方法 但这个构造方法已经初始化完成了       new 只是半初始化  只有调用了构造方法 才算初始化完成

  astore_1 将地址弹栈到局部变脸表 下标为1的位置 h 所以 h 指向了Hellow_02的内存地址

  aload_1 将这个h对应的内存地址压栈

  invokevirtual  调用m1方法    需要将h 弹栈  然后执行上面m1 的栈帧的操作

  m1 操作完了 return

 

 

 ----------------------------------------------------------------------------------- ----------------------------------------------------------------------------------- -----------------------------------------------------------------------------------

 

 

 

 

 

 

 

复制代码
 在 m 方法中  因为是非静态方法  
0  this
1 3
将局部变量表中 下标为1的n 压栈
将 常量 1 压栈
if icmpne 如果 两个值比较ne 不相等 弹栈 就跳到第七条指令

第七条值指令 iload_1 将3压栈
将this 压栈
iload_1 将 3 压栈
将 1 压栈
isub 将3和1弹出 执行相减3-1 值为2 将2 压栈
invokevirtual 执行m方法 将2传入m 方法 调用m(2)方法 又要重新开始指令 还需要将this 传给m2 方法
将局部变量表的1 位置的2 压入栈
当n=1时 就将1 返回给m2 的栈帧 m2 在返回给m3 m3再返回main

复制代码

<clinit >  静态语句块

<init> 构造方法

 

posted @   花心大萝卜li  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示