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次 + 

  

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 01:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 01:24:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 01:24:02       82 阅读
  4. Python语言-面向对象

    2023-12-08 01:24:02       91 阅读

热门阅读

  1. Redisson

    2023-12-08 01:24:02       69 阅读
  2. 算法 拓扑序列

    2023-12-08 01:24:02       51 阅读
  3. Redis默认序列化方式乱码原因及解决办法

    2023-12-08 01:24:02       61 阅读
  4. 计算机网络——传输层

    2023-12-08 01:24:02       60 阅读
  5. python模块 — json

    2023-12-08 01:24:02       65 阅读
  6. TCP_NODELAY与TCP通信效率

    2023-12-08 01:24:02       61 阅读
  7. 【算法】合并K个升序链表

    2023-12-08 01:24:02       58 阅读
  8. Dynamo学习使用的网站

    2023-12-08 01:24:02       58 阅读
  9. 【NEON】学习资料汇总

    2023-12-08 01:24:02       61 阅读
  10. 【Centos8】配置网络镜像源

    2023-12-08 01:24:02       53 阅读
  11. golang实现函数yamlToStruct(infile,outFile)

    2023-12-08 01:24:02       49 阅读