【从零学习JVM|第二篇】字节码文件
前言:
通过了解字节码文件可以帮助我们更容易的理解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字节。
-
作用:描述类/接口的访问属性(如
public
、final
、abstract
等)。 -
常见标志位:
-
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
表示int
,Ljava/lang/String;
表示字符串)。
7. 方法表(Methods)
-
结构:
-
方法计数器(2字节)
-
方法详细信息表(每个方法包含访问标志、名称索引、描述符索引等)。
-
-
关键属性:每个方法内嵌一个
Code
属性(见下文),存储实际字节码指令。
8. 属性表(Attributes)
-
通用结构:
-
属性计数器(2字节)
-
属性信息集合(每个属性包含名称索引、长度、自定义数据)。
-
-
核心属性类型:
-
Code
属性:存储方法的字节码指令、操作数栈深度、局部变量表等。 -
LineNumberTable
:映射字节码偏移量到源代码行号(调试用)。 -
SourceFile
:源文件名(如HelloWorld.java
)。 -
Exceptions
:方法声明的受检异常。 -
Synthetic
:标记编译器生成的成员。
-
关键特点
-
紧凑性:所有数据以无符号数(
u1
/u2
/u4
)紧凑存储。 -
符号引用:类/方法/字段名均以常量池索引形式存在。
-
可扩展性:通过属性表支持自定义扩展(如注解信息存储在
RuntimeVisibleAnnotations
属性中)。
阅读字节码文件
0 iconst_0 // 将int类型常量0压入操作数栈顶1 istore_1 // 将操作数栈顶的int类型数值(0)存入第二个局部变量槽中(局部变量索引1)2 iload_1 // 从局部变量表中加载索引为1的int类型值到操作数栈顶3 iinc 1 by 1 // 将局部变量表中索引为1的int类型变量增加16 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_01 istore_12 iinc 1 by 15 iload_16 istore_17 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
总结
希望通过这篇文章,可以让你对字节码文件的认识更加清晰,通过学习字节码文件我们也算是接触到了更加深层次的代码学习,可以让我们从最底层的逻辑来学习代码的执行。感谢你的阅读,你的阅读和点赞是我最大动力。
相关文章:

【从零学习JVM|第二篇】字节码文件
前言: 通过了解字节码文件可以帮助我们更容易的理解JVM的工作原理,所以接下来,我们来介绍一下字节码文件。 目录 前言: 正确的打开字节码文件 字节码文件组成 1. 魔数(Magic Number) 2. 版本号&…...

Fractal Generative Models论文阅读笔记与代码分析
何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月,当时我也听说这篇文章时感觉是大有可为,但是几个月不知道忙啥了,可能错过很多机会,但是亡羊补牢嘛,而且截至目前,该文章应该也还…...
软件测试—学习Day11
今天学习下兼容性 1.App兼容性常见问题 以下是关于 App 兼容性问题的常见举例,涵盖界面展示、操作逻辑、性能差异三大维度,涉及不同系统、设备及网络环境的兼容性场景: 一、界面展示问题 界面展示兼容性问题主要由操作系统版本差异、屏幕…...

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

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. **分支引用(Branch References)**2. **标签引用(Tag References)**3. **HEAD 引用**4. **远程引用(Remote References)*…...

Github 2025-06-07 Rust开源项目日报Top10
根据Github Trendings的统计,今日(2025-06-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1TypeScript项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Ge…...
gorm 配置数据库
介绍 GORM 是 Go 语言中最流行的 ORM(对象关系映射)库之一,基于数据库操作的封装,提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…...

自动化立体仓库堆垛机控制系统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生成大规模无线通信网络拓扑(任意节点数量)
功能: 生成任意节点数量的网络拓扑,符合现实世界节点空间分布和连接规律 效果: 30节点: 100节点: 500节点: 程序: %创建时间:2025年6月8日 %zhouzhichao %自然生长出n节点的网络% …...

ubuntu 20.04挂载固态硬盘
我们有个工控机,其操作系统是ubuntu 20.04。可以接入一个固态硬盘。将固态硬盘插好后,就要进行挂载。在AI的指导下,过程并不顺利。记录如下: 1、检查硬盘是否被识别 安装好硬盘后,运行以下命令来检查Linux系统是否…...
【AI教我写网站-ECG datacenter】
阶段性总结:后端用户管理基础 在项目管理和协作中,清晰地阐述“为什么做”比“怎么做”更能凝聚共识和提供方向。我们不仅要理解技术实现,更要明白其背后的动机和意义。 让我们重新回顾并总结我们到目前为止的工作,这次会更侧重…...
2. Web网络基础 - 协议端口
深入解析协议端口与netstat命令:网络工程师的实战指南 在网络通信中,协议端口是服务访问的门户。本文将全面解析端口概念,并通过netstat命令实战演示如何监控网络连接状态。 一、协议端口核心知识解析 1. 端口号的本质与分类 端口范围类型说…...

PC与Windows远程连接与串流:方案简介(ZeroTier + Parsec、Moonlight + Sunshine、网易UU远程)
简介 在远程办公、云游戏、家用 NAS 串流、图形远程渲染等需求增长的背景下,越来越多用户开始寻找低延迟、高画质、跨网络可用的远程连接方案。今天这篇文章将深度分析三种目前在玩家圈和远程办公中都非常流行的组合方案: 🟢 ZeroTier Pars…...

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

浏览器兼容-polyfill-本地服务-优化
babel和webpack结合 npx babel src --out-dir dist --presetsbabel/preset-env 这是把src下面的东西都用babel转化一下 webpack可以和babel结合使用,首先下载一个这东西: npm install babel-loader -D webpack配置: const path requir…...

c++ decltype关键字
decltype为类型推导关键字。 示例代码: // 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…...
分享今天做的力扣SQL题
其实做之前就打算分享的,但是做完又不想分享了。。。结果没几分钟,还是,写一下吧。我就当各位是监督我的。 说一下,这是第一天做SQL题,虽然我也是软件工程专业,但是学的本来就不好,又忘了个差不…...
全球化2.0|云轴科技ZStack助力香港服务机构VMware替代
香港一家大型社会服务机构长期致力于为公众提供支持与服务,是本地具有代表性的社会服务组织,在香港设有数十个服务中心。为应对VMware订阅模式带来的成本上升和硬件资源受限等问题,该机构决定采用云轴科技ZStack Cloud云平台替代VMware虚拟化…...

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

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

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面
文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…...
uni-app 项目支持 vue 3.0 详解及版本升级方案?
uni-app 支持 Vue 3.0 详解及升级方案 一、uni-app 对 Vue 3.0 的支持现状 uni-app 从 3.0 版本 开始支持 Vue 3.0,主要变化包括: 核心框架升级: 基于 Vue 3.0 的 Composition API 和 Options API 双模式支持提供 vueuse/core 等组合式 API…...
SpringBoot3中使用虚拟线程的详细过程
在 Spring Boot 3 中使用 Java 21 的虚拟线程(Virtual Threads)可以显著提升 I/O 密集型应用的并发能力。以下是详细实现步骤: 1. 环境准备 JDK 21:确保安装 JDK 21 或更高版本Spring Boot 3.2:最低要求(p…...
达梦使用存储过程实现删除重复记录、判断并添加主键和自增列的逻辑
在达梦数据库中,要确保主键的唯一性约束,可以在存储过程的最前面添加删除重复记录的逻辑。以下是一个完整的存储过程,包含删除重复记录、判断并添加主键和自增列的逻辑: 存储过程示例 -- 切换到指定模式;schema_name 是目标模…...
MySQL间隙锁入手,拿下间隙锁面试与实操
一、MySQL 间隙锁,究竟是什么? 在 MySQL 的世界里,间隙锁(Gap Lock)就像是一个默默守护数据一致性的卫士,看似低调,却在并发控制中扮演着至关重要的角色。 想象一下,你去图书馆借…...

词法分析和词性标注 自然语言处理
目录 一. 概述 1 不同语言的词法分析 2 英语的形态分析 英语单词的形态还原(和正常英语的词法变化一样) 1.有规律变化单词的形态还原 编辑 2.动词、名词、形容词、副词不规则变化单词的形态还原 3.对于表示年代&…...

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

架构设计技巧——架构设计模板
一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架,结合了业界最佳实践,并强调灵活裁剪: 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…...
交易系统开发:跨境资本的高速通道架构解密
连接纽约、香港与内陆的金融管道工程 总收益互换(TRS)在港美股投资中扮演着跨境资本流动的“隐形桥梁”。本文基于真实跨境券商系统开发实践,深入解析支持多市场、多币种、多通道的TRS平台架构设计与业务解决方案。 一、港美股TRS的核心价值&…...