【从零学习JVM|第二篇】字节码文件

news2025/7/28 2:34:54

前言:

通过了解字节码文件可以帮助我们更容易的理解JVM的工作原理,所以接下来,我们来介绍一下字节码文件。

目录

前言:

正确的打开字节码文件

字节码文件组成

1. 魔数(Magic Number)

2. 版本号(Version Information)

3. 常量池(Constant Pool)

4. 访问标志(Access Flags)

5. 类/父类/接口信息

6. 字段表(Fields)

7. 方法表(Methods)

8. 属性表(Attributes)

关键特点

阅读字节码文件

总结


正确的打开字节码文件

字节码文件想要正确打开需要使用工具,它保存的是源码编译之后的结果是二进制,如果直接打开我们是看不懂的,推荐jclasslib我们可以直接在idea中安装

通过View下划红线位置打开

打开之后我们就可以清晰的看见字节码文件的组成。现在我们来具体的介绍一下这些信息。

字节码文件组成

1. 魔数(Magic Number)

  • 位置:文件起始的4字节(0xCAFEBABE)。

  • 作用:标识这是一个合法的.class文件(JVM加载时会首先验证此值)。

在一般信息我们是看不见它的,但是在每个java字节码文件中都会有它,没有它就不能叫java字节码文件。

2. 版本号(Version Information)

  • 组成

    • 次版本号(Minor Version):2字节(通常为0)。

    • 主版本号(Major Version):2字节(例如jdk8为52,jdk11为55)。

  • 作用:JVM据此判断是否兼容该字节码文件。

我们可以通过主版本号-44得到jdk版本,(例如jdk8为52,jdk11为55)。

3. 常量池(Constant Pool)

  • 核心地位:字节码中占比最大的部分,存储所有字面量符号引用

  • 结构

    • 常量池计数器(Constant Pool Count):2字节,表示常量数量(实际数量 = 计数值 - 1)。

    • 常量池表(Constant Pool Entries):每个条目结构不同,类型由1字节的tag标识。

常量池可以避免我们的内容重复,节省空间。

4. 访问标志(Access Flags)

  • 位置:常量池之后的2字节。

  • 作用:描述类/接口的访问属性(如publicfinalabstract等)。

  • 常见标志位

    • ACC_PUBLIC(0x0001)

    • ACC_FINAL(0x0010)

    • ACC_INTERFACE(0x0200)

    • ACC_ENUM(0x4000)

5. 类/父类/接口信息

  • 当前类索引(This Class):2字节,指向常量池中CONSTANT_Class条目。

  • 父类索引(Super Class):2字节(0表示继承java.lang.Object)。

  • 接口表(Interfaces)

    • 接口计数器(2字节)

    • 接口索引集合(每个索引2字节,指向常量池)。

6. 字段表(Fields)

  • 组成

    • 字段计数器(2字节)

    • 字段详细信息表(每个字段包含访问标志、名称索引、描述符索引等)。

  • 描述符(Descriptor):描述字段类型(如I表示intLjava/lang/String;表示字符串)。

7. 方法表(Methods)

  • 结构

    • 方法计数器(2字节)

    • 方法详细信息表(每个方法包含访问标志、名称索引、描述符索引等)。

  • 关键属性:每个方法内嵌一个Code属性(见下文),存储实际字节码指令。

8. 属性表(Attributes)

  • 通用结构

    • 属性计数器(2字节)

    • 属性信息集合(每个属性包含名称索引、长度、自定义数据)。

  • 核心属性类型

    • Code属性:存储方法的字节码指令、操作数栈深度、局部变量表等。

    • LineNumberTable:映射字节码偏移量到源代码行号(调试用)。

    • SourceFile:源文件名(如HelloWorld.java)。

    • Exceptions:方法声明的受检异常。

    • Synthetic:标记编译器生成的成员。

关键特点

  1. 紧凑性:所有数据以无符号数(u1/u2/u4)紧凑存储。

  2. 符号引用:类/方法/字段名均以常量池索引形式存在。

  3. 可扩展性:通过属性表支持自定义扩展(如注解信息存储在RuntimeVisibleAnnotations属性中)。

阅读字节码文件

 0 iconst_0          // 将int类型常量0压入操作数栈顶
 1 istore_1          // 将操作数栈顶的int类型数值(0)存入第二个局部变量槽中(局部变量索引1)
 2 iload_1           // 从局部变量表中加载索引为1的int类型值到操作数栈顶
 3 iinc 1 by 1       // 将局部变量表中索引为1的int类型变量增加1
 6 istore_1          // 将操作数栈顶的int类型数值(经过iinc后的值)存入第二个局部变量槽中(局部变量索引1)
 7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;> // 获取类java.lang.System的静态字段out的值,即PrintStream对象,并压入操作数栈顶
10 iload_1           // 从局部变量表中加载索引为1的int类型值到操作数栈顶
11 invokevirtual #3 <java/io/PrintStream.println : (I)V> // 调用PrintStream对象的println方法打印int值
14 return            // 从当前方法返回

我们来看看它的源代码。

所以这个时候i的值就是0,可以跟着注释一步步走你就能清楚了。

 0 iconst_0
 1 istore_1
 2 iinc 1 by 1
 5 iload_1
 6 istore_1
 7 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println : (I)V>
14 return

它的源码

可以看见两个代码的字节码指令的iinc 1 by 1和iload_1的位置不同,也就是我们常说的,i++先赋值在自增,而++i是先自增在赋值。所以两个代码的值分别是0和1

总结

    希望通过这篇文章,可以让你对字节码文件的认识更加清晰,通过学习字节码文件我们也算是接触到了更加深层次的代码学习,可以让我们从最底层的逻辑来学习代码的执行。感谢你的阅读,你的阅读和点赞是我最大动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405920.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fractal Generative Models论文阅读笔记与代码分析

何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月&#xff0c;当时我也听说这篇文章时感觉是大有可为&#xff0c;但是几个月不知道忙啥了&#xff0c;可能错过很多机会&#xff0c;但是亡羊补牢嘛&#xff0c;而且截至目前&#xff0c;该文章应该也还…

OGG-01635 OGG-15149 centos服务器远程抽取AIX oracle11.2.0.4版本

背景描述 有一套ogg远程抽取的环境&#xff0c;源端是AIX7.1环境的oracle 11.2.0.4版本的数据库&#xff0c;中间是OGG抽取服务器&#xff0c;目标端是centos 7.9环境的oracle 19c。 采用集成模式远程抽取源端数据正常&#xff0c;但是经典模式远程抽取源数据的时候抽取进程启…

Kotlin REPL初探

文章目录 1. Kotlin REPL 简介2. 在命令行中玩Kotlin REPL2.1 下载Kotlin编译器压缩包2.2 安装配置Kotlin编译器2.3 启动Kotlin交互式环境2.4 在命令行玩Kotlin REPL 3. 在IDEA里玩Kotlin REPL3.1 打开Kotlin REPL窗口3.2 在Kotlin REPL窗口玩代码 4. Kotlin REPL 的优势 1. Ko…

git引用概念(git reference,git ref)(简化对复杂SHA-1哈希值的管理)(分支引用、标签引用、HEAD引用、远程引用、特殊引用)

文章目录 **引用的本质**1. **引用是文件**2. **引用的简化作用** **引用的类型**1. **分支引用&#xff08;Branch References&#xff09;**2. **标签引用&#xff08;Tag References&#xff09;**3. **HEAD 引用**4. **远程引用&#xff08;Remote References&#xff09;*…

Github 2025-06-07 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-06-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1TypeScript项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Ge…

自动化立体仓库堆垛机控制系统STEP7 OB1功能块

1、堆垛机控制系统STEP7硬件组态如下图 CPU CPU 314C-2 PN/DP 6ES7 314-6EH04-0AB0 SM 338 POS-INPUT AO2x12Bit 6ES7 332-5HB01-0AB0 2、堆垛机控制系统STEP7内部变量 前进HMI M 0.0 BOOL 后退HMI M 0.1 BOOL 上升HMI M 0.2 B…

MATLAB生成大规模无线通信网络拓扑(任意节点数量)

功能&#xff1a; 生成任意节点数量的网络拓扑&#xff0c;符合现实世界节点空间分布和连接规律 效果&#xff1a; 30节点&#xff1a; 100节点&#xff1a; 500节点&#xff1a; 程序&#xff1a; %创建时间&#xff1a;2025年6月8日 %zhouzhichao %自然生长出n节点的网络% …

ubuntu 20.04挂载固态硬盘

我们有个工控机&#xff0c;其操作系统是ubuntu 20.04。可以接入一个固态硬盘。将固态硬盘插好后&#xff0c;就要进行挂载。在AI的指导下&#xff0c;过程并不顺利。记录如下&#xff1a; 1、检查硬盘是否被识别 安装好硬盘后&#xff0c;运行以下命令来检查Linux系统是否…

PC与Windows远程连接与串流:方案简介(ZeroTier + Parsec、Moonlight + Sunshine、网易UU远程)

简介 在远程办公、云游戏、家用 NAS 串流、图形远程渲染等需求增长的背景下&#xff0c;越来越多用户开始寻找低延迟、高画质、跨网络可用的远程连接方案。今天这篇文章将深度分析三种目前在玩家圈和远程办公中都非常流行的组合方案&#xff1a; &#x1f7e2; ZeroTier Pars…

SpringBoot+MySQL家政服务平台 设计开发

概述 基于SpringBootMySQL开发的家政服务平台完整项目&#xff0c;该系统实现了用户预约、服务管理、订单统计等核心功能&#xff0c;采用主流技术栈开发&#xff0c;代码规范且易于二次开发。 主要内容 系统功能架构 本系统采用前后端分离架构&#xff0c;前端提供用户交互…

浏览器兼容-polyfill-本地服务-优化

babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用&#xff0c;首先下载一个这东西&#xff1a; npm install babel-loader -D webpack配置&#xff1a; const path requir…

c++ decltype关键字

decltype为类型推导关键字。 示例代码&#xff1a; // decltype也可用于函数模板编程: template<typename T, typename U> auto add(T t, U u) -> decltype(t u) {return t u; }// decltype推导函数返回类型 auto doubleNumFunc(int x) -> decltype(x * 2) {ret…

Selenium自动化测试工具安装和使用(PyCharm)

一&#xff0c;了解驱动 手工测试我们很了解&#xff0c;假设我要测试百度首页是否正常&#xff0c;只需要鼠标点击打开浏览器&#xff0c;然后输入百度网址即可 但是对于程序来说&#xff0c;打开浏览器&#xff0c;需要用到对应的驱动&#xff0c;就好比你给电脑装了个外置…

【网络安全】fastjson原生链分析

fastjson 原生链 前言 说起 fastjson 反序列化&#xff0c;大部分的利用都是从 type 把 json 串解析为 java 对象&#xff0c;在构造方法和 setter、getter 方法中&#xff0c;做一些文件或者命令执行的操作。当然&#xff0c;在 fastjson 的依赖包中&#xff0c;也存在着像 …

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面

文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…

词法分析和词性标注 自然语言处理

目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原&#xff08;和正常英语的词法变化一样&#xff09; 1.有规律变化单词的形态还原 ​编辑 2.动词&#xff64;名词&#xff64;形容词&#xff64;副词不规则变化单词的形态还原 3.对于表示年代&…

QT聊天项目DAY14

1. 客户端登录 1.1 初始化玩家头像 将头像的大小固定在250 * 250 void InitHeadImage(); // 初始化头像/* 初始化头像 */ void LoginWidget::InitHeadImage() {// 加载头像QPixmap OriginalPixmap(":/Chat/Images/head_5.jpg");OriginalPixmap …

架构设计技巧——架构设计模板

一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架&#xff0c;结合了业界最佳实践&#xff0c;并强调灵活裁剪&#xff1a; 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…

【Ragflow】27.RagflowPlus(v0.4.1):小版本迭代,问题修复与功能优化

概述 RagflowPlus v0.4.0 在发布后&#xff0c;收到了积极的反馈&#xff0c;同时也包含一些问题。 本次进行一轮小版本更新&#xff0c;发布 v0.4.1 版本&#xff0c;对已知问题进行修复&#xff0c;并对部分功能进行进一步优化。 开源地址&#xff1a;https://github.com/…

【Oracle】数据仓库

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 数据仓库概述1.1 为什么需要数据仓库1.2 Oracle数据仓库架构1.3 Oracle数据仓库关键技术 2. 数据仓库建模2.1 维度建模基础2.2 星形模式设计2.3 雪花模式设计2.4 缓慢变化维度&#xff08;SCD&#xff09;处…