【JVM】字节码文件的组成部分


🐌个人主页: 🐌 叶落闲庭

💨我的专栏:💨
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


JVM

  • 一、字节码文件的组成部分
    • [1.1 iconst_0](#1.1 iconst_0)
    • [1.2 istore_1](#1.2 istore_1)
    • [1.3 iload_1](#1.3 iload_1)
    • [1.4 iconst_1](#1.4 iconst_1)
    • [1.5 iadd](#1.5 iadd)
    • [1.6 istore_2](#1.6 istore_2)
    • [1.7 return](#1.7 return)
  • [二、执行i++ 操作](#二、执行i++ 操作)
    • [2.1 iconst_0](#2.1 iconst_0)
    • [2.2 istore_1](#2.2 istore_1)
    • [2.3 iinc 1 by 1](#2.3 iinc 1 by 1)
    • [2.4 return](#2.4 return)
  • [三、字节码常用工具:javap -v命令](#三、字节码常用工具:javap -v命令)

一、字节码文件的组成部分

  • 操作数栈是临时存放数据的地方
  • 局部变量表是存放方法中的局部变量的位置

观察如下代码的字节码文件

java 复制代码
int i = 0;
int j = i + 1;

具体的java源代码:

java 复制代码
public static void main(String[] args) {
    int i = 0;
    int j = i + 1;
}

要想看到java的字节码文件的内容,可以通过jclasslib这个工具来看,运行以上代码,然后通过jclasslib可以看到在这个方法中变量的存放位置,其中,局部变量表数组的0索引位置存放的是main方法的参数 args ,1索引位置存放的是第一个变量 i ,2索引存放的是第二个变量 j ,可以看出,定义在方法中的变量,方法的参数也将作为这个方法的变量存入局部变量表中,定义在方法内的变量会按定义的先后顺序依次存入局部变量表中。

接下来解析这段代码的字节码文件:

  • iconst_0:将常量0放入到操作数栈中
  • istore_1:将操作数栈中的值取出放入局部变量表索引为1的位置
  • iload_1:将局部变量表索引为1的位置的值复制一份放入到操作数栈中
  • iconst_1:将常量1放入到操作数栈中
  • iadd:将操作数栈中最上面的两个值相加,并把结果存放在栈中
  • istore_2:将操作数栈中的值取出放入局部变量表索引为2的位置
  • return:方法结束,返回

1.1 iconst_0



1.2 istore_1



1.3 iload_1



1.4 iconst_1



1.5 iadd



1.6 istore_2



1.7 return


二、执行i++ 操作

  • 源代码:
java 复制代码
public static void main(String[] args) {
    int i = 0;
    i++;
}
  • 字节码:
  • iconst_0:将常量0放入操作数栈中

  • istore_1:将操作数栈中的值取出放入索引为1的局部变量表中

  • iinc 1 by 1:在局部变量表索引为1的位置增加1

  • return:方法结束,返回

2.1 iconst_0



2.2 istore_1



2.3 iinc 1 by 1

根据JVM规范,iinc就是通过一个常量递增局部变量



2.4 return



三、字节码常用工具:javap -v命令

javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。

适合在服务器上查看字节码文件内容。

直接输入javap查看所有参数。

输入javap-v字节码文件名称查看具体的字节码信息。(如果jar包需要先使用jar-vf命令解压)

相关推荐
用户094248568031 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu1 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
2601_962071576 小时前
类变量和全局变量的隔离性有什么区别?
java·开发语言·jvm
估值探索者8 小时前
【Python量化系统工程实战 #01】数据存储选型 CSVSQLiteMySQL 对比与 SQLite 实战建库
开发语言·jvm·python·sqlite·api接口·数据api接口·股票数据api接口
打工仔折腾 AI19 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
用户094248568031 天前
第22章:JIT编译分层——Interpreter、C1、C2与热点探测
java·jvm
乌暮1 天前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
长河2 天前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
可乐ea2 天前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
一条破秋裤2 天前
Linux 线程同步:读写锁
java·linux·jvm