【JVM篇】分析并讲解字节码文件

文章目录

🍔字节码文件

字节码文件是一种中间表示形式,它通常由编译器将高级编程语言(如Java、Python等)源代码编译而成。字节码文件包含了程序的指令集,可以被解释器或虚拟机读取和执行。

对于Java语言而言,编译Java源代码后会生成字节码文件(以.class为扩展名),其中包含了Java虚拟机(JVM)可理解的指令集。字节码文件可以在不同的平台上运行,因为它们是跨平台的中间表示形式。JVM会将字节码文件加载到内存中,并逐条解释执行其中的指令。

字节码文件具有以下特点:

  • 它是一种中间表示形式,介于源代码和机器码之间。
  • 字节码文件可以在不同的平台上执行(需要安装相应的虚拟机)。
  • 它是面向对象编程语言(如Java)的典型编译结果。
  • 字节码文件可以进行优化和加密,以提高执行效率和保护代码安全性。

通过将源代码编译成字节码文件,可以实现代码的平台无关性,并提供更高层次的安全性和运行时的灵活性。

⭐打开字节码文件的工具

推荐使用jclasslib工具来查看字节码文件

官网:https://github.com/ingokegel/jclasslib/releases

下载下来进行安装即可

⭐字节码文件的组成

Java字节码文件的组成包括:

  • 魔数(Magic Number):4个字节,用于标识此文件是否是一个合法的字节码文件。
  • 版本号(Version Number):2个字节,用于指定字节码文件的版本号。高版本的JVM可能不支持低版本的字节码文件。
  • 常量池(Constant Pool):变长的数据结构,存储各种字面量和符号引用。包括类名、字段名、方法名、接口名、字符串常量等。

  • 访问标志(Access Flags):2个字节,用于表示类或者接口的访问属性,如public、final、abstract等。

  • 类索引、父类索引和接口索引集合:各2个字节,用于描述类的继承关系和实现的接口。

  • 字段表集合(Field Table):变长的数据结构,用于描述类中定义的所有字段。

  • 方法表集合(Method Table):变长的数据结构,用于描述类中定义的所有方法。

  • 属性表集合(Attribute Table):变长的数据结构,用于描述类的附加信息,包括源代码文件名、注解等。

其中,常量池是字节码文件中最重要的部分之一,它包含了几乎所有的字面量和符号引用,并为虚拟机执行字节码提供了必要的信息。字段表集合和方法表集合则描述了类中定义的所有属性和方法,包括访问修饰符、名称和描述符等信息。属性表集合用于描述类的附加信息,如源代码文件名、注解等。

通过这些部分的组合,Java虚拟机可以读取和执行字节码文件中的指令,并最终完成程序的执行。

✨具体分析

我们分析一下下面这段代码的jvm执行过程

java 复制代码
package org.example;

public class Demo1 {
    public static void main(String[] args) {
        int i=0;
        int j=i+1;
    }
}

首先找到字节码文件

使用上面提到的工具打开

下面我们来分析执行过程

  1. iconst_0:将常量值0压入操作数栈顶。此时操作数栈:[0]。
  2. istore_1:将操作数栈顶的值(0)存储到本地变量表中索引为1的位置(即变量 i )。此时本地变量表:[0, 0]。
  3. iload_1:将本地变量表中索引为1的值(即变量i的值)压入操作数栈顶。此时操作数栈:[0]。
  4. iconst_1:将常量值1压入操作数栈顶。此时操作数栈:[0, 1]。
  5. iadd:从操作数栈中弹出两个值(0和1),执行加法操作,并将结果(1)压入操作数栈顶。此时操作数栈:[1]。
  6. istore_2:将操作数栈顶的值(1)存储到本地变量表中索引为2的位置(即变量j)。此时本地变量表:[0, 0, 1]。
  7. return:方法执行完毕,返回。

在执行过程中,代码中定义的变量i和j分别被存储在本地变量表的索引1和索引2处。通过字节码指令对操作数栈和本地变量表的读写操作,实现了变量的赋值和运算。最终,方法执行完毕并返回。

相关推荐
majingming1234 小时前
FUNCTION
java·前端·javascript
zopple4 小时前
常见的 Spring 项目目录结构
java·后端·spring
2401_874732535 小时前
为你的Python脚本添加图形界面(GUI)
jvm·数据库·python
xuxie996 小时前
N11 ARM-irq
java·开发语言
cjy0001116 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20176 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01226 小时前
Spring Boot实现定时任务
java
小江的记录本7 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34167 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默7 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试