JVM调优篇之JVM基础入门AND字节码文件解读
目录
- Java程序编译
- class文件内容
- 常量池
- 附录-访问标识表
- 附录-常量池类型列表
Java程序编译
Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。

规范
Java虚拟机有自己的一套规范,遵循这套规范,任何形式的语言都可以在JVM上运行,前提是编译成class文件,此规范相见oracle官网文档。
实现
JVM虚拟机落地实现有很多,常见的有:
- Hotspot,使用最热门的JVM
- OpenJ9,IBM开发
- MicroSoft JVM 微软开发
- TaobaoVM 淘宝开发
- azul zing VM 垃圾回收行业标杆,最快
class文件内容
从上图内容可看出class文件包以下几个方面内容:
- 魔数(
magic number)占4个字节,固定的值0xcafebabe,主要来校验class文件。 - version 版本号,分为小版本号
minor version和大版本号major version,各占两个字节。 - 常量池信息(
constant_pool),具体的各种常量信息,字符串,类名,方法名,字段名等。 - 访问标识(
access_flag),2个字节描述类与接口的修饰符,有几个常见的常量值见附录-访问标识 - 当前类(
this_class) - 当前类的父类(
super_class) - 具体的接口信息(
interfaces) - 具体的属性信息(
fileds) - 具体的方法信息(
methods) - 其它附加属性信息(
attributes)
更具体的内容如下:
| 项目 | Value |
|---|---|
| Magic Number | 魔数(CAFE BABE) |
| Minor Number | 次版本号 |
| Major Number | 主版本号 |
| constant_pool_count | 常量池数量 |
| constant_pool | 常量池具体实现,是一种表 |
| access_flag | 访问标识 |
| this_class | 当前类名 |
| super_class | 父类名称 |
| interfaces_count | 接口数量 |
| interfaces | 具体实现的接口信息 |
| fileds_count | 属性数量 |
| fileds | 具体属性信息 |
| methods_count | 方法数量 |
| methods | 具体方法的信息 |
| attributes_count | 其它附加属性的数量 |
| attributes | 其它附加属性具体信息 |
现在来看具体示例来看上面的代表是什么意思,准备一个简单的类:
public class ByteCode01 {public ByteCode01() {}
}
编译之后的字节码文件:

class文件中就是一个二进制字节流,非0即1,数据类型有五种,u1,u2,u4,u8和_info表类型。
上述这种文件需要借助工具来分析具体内容,在idea安装jclasslib插件看Java文件编译成class文件信息,选中编译后的class文件,如下图所示:

访问标识是固定的值,通过位运算得出的0x0021既代表public又代表super(0x0021是0x0001与0x0020位与运算),详见附录-访问标识表
更直观的表现:

常量池
本类索引即当前类名(this_class),cp_info是constant_pool的表类型,#2是第二张表,cp_info #2代表常量池第二张表,存的是对cp_info #14的引用,cp_info #14存的是具体的字符串值,就是当前类的类名。


class文件中都有属于自己的常量池,常量池包含类型列表,来存储类、方法、字段、接口等信息,以及各种字面量,通过解析常量池可以访问这些字符串信息。比如上图出现的CONSTANT_Utf8_info、CONSTANT_Class_info等详见文末常量池类型列表。
着重看下CONSTANT_Utf8_info,它用来存储 UTF-8 编码的字符串,相当于一张常量池表,看一下它的具体结构:
| 字段名 | 字节数 | 描述 |
|---|---|---|
| tag | 1 | CONSTANT_Utf8_info的常量类型是1(其余的见文末常量池类型列表) |
| length | 2 | u2(2 字节无符号数) 类型字段,表示 bytes 部分字节长度,以字节为单位的 |
| bytes | length | 实际字符串数据,采用 UTF-8 编码显示 |
比如
public class Test {public static void main(String[] args) {System.out.println("Hello, World!");}
}
字符串 Hello, World!,会以 CONSTANT_Utf8_info 类型存储在常量池中,对应的二进制内容或许是:
tag = 0x01 (标识 CONSTANT_Utf8_info)
length = 0x000D (字符串的字节长度为 13)
bytes = 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 ("Hello, World!" 的 UTF-8 编码)
常量池通常分为下面几种常量值类型:
| 类型 | 标志(tag) | 描述 |
|---|---|---|
| CONSTANT_Utf8_info | 1 | UTF-8编码的字符串 |
| CONSTANT_Integer_info | 3 | 整型字面量 |
| CONSTANT_Float_info | 4 | 浮点型字面 |
| CONSTANT_Long_info | 5 | 长整型字面量 |
| CONSTANT_Double_info | 6 | 双精度浮点型字面量 |
| CONSTANT_Class_info | 7 | 类或接口的符号引用 |
| CONSTANT_String_info | 8 | 字符串类型字面量 |
| CONSTANT_Fieldref_info | 9 | 字段的符号引用 |
| CONSTANT_Methodref_info | 10 | 类中方法的符号引用 |
| CONSTANT_InterfaceMethodref_info | 11 | 接口中方法的符号引用 |
| CONSTANT_NameAndType_info | 12 | 字段或方法的部分符号引用 |
| CONSTANT_MethodHandle_info | 15 | 表示方法句柄 |
| CONSTANT_MethodType_info | 16 | 表示方法类型 |
| CONSTANT_InvokeDynamic_info | 18 | 表示一个动态方法调用点 |
附录-访问标识表
| 项目 | Value |
|---|---|
| ACC_PUBLIC 0x0001 | 是否是public类型 |
| ACC_FINAL 0x0010 | 是否是NULL |
| ACC_SUPER 0x0020 | 该标志必须为真 |
| ACC_INTERFACE 0x0200 | 是否为接口 |
| ACC_ABSTRACT 0X0400 | 是否是接口或者抽象类 |
| ACC_SYNTHETIC 0x1000 | 编译器自动生成,非用户代码产生 |
| ACC_ANNOTATION 0x2000 | 是否为注解 |
| ACC_ENUM 0x4000 | 是否为枚举 |
附录-常量池类型列表
| 常量类型 | tag值 | 描述 |
|---|---|---|
| CONSTANT_Utf8_info | 1 | 用于存储 UTF-8 编码的字符串 |
| CONSTANT_Integer_info | 3 | 用于存储 4 字节的整型字面量(int) |
| CONSTANT_Float_info | 4 | 用于存储 4 字节的浮点型字面量(float) |
| CONSTANT_Long_info | 5 | 用于存储 8 字节的长整型字面量(long) |
| CONSTANT_Double_info | 6 | 用于存储 8 字节的双精度浮点型字面量(double) |
| CONSTANT_Class_info | 7 | 用于存储类或接口的符号引用,引用 CONSTANT_Utf8_info 中的类名 |
| CONSTANT_String_info | 8 | 用于存储字符串字面量,引用 CONSTANT_Utf8_info 中的字符串内容 |
| CONSTANT_Fieldref_info | 9 | 用于存储字段的符号引用,引用类和字段的描述信息 |
| CONSTANT_Methodref_info | 10 | 用于存储类中方法的符号引用,引用类和方法的描述信息 |
| CONSTANT_InterfaceMethodref_info | 11 | 用于存储接口中方法的符号引用,引用接口和方法的描述信息 |
| CONSTANT_NameAndType_info | 12 | 用于描述字段或方法的名称和类型,引用名称(Utf8)和描述符(Utf8) |
| CONSTANT_MethodHandle_info | 15 | 用于存储对方法句柄的引用(invokedynamic 指令用) |
| CONSTANT_MethodType_info | 16 | 用于存储方法类型的符号引用,指向方法描述符(Utf8) |
| CONSTANT_Dynamic_info | 17 | 用于存储动态调用点的信息(JDK 11 引入,支持动态常量) |
| CONSTANT_InvokeDynamic_info | 18 | 用于存储动态方法调用点的信息,引用引导方法和动态调用名称 |
| CONSTANT_Module_info | 19 | 用于存储模块的符号引用(JDK 9 引入) |
| CONSTANT_Package_info | 20 | 用于存储包的符号引用(JDK 9 引入) |
相关文章:
JVM调优篇之JVM基础入门AND字节码文件解读
目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范,遵循这套规范,任…...
EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列
使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码,我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格,按“CTRLD”向下填充,就可以得出其它几行“-”之前的…...
数据库期末复习题库
1. Mysql日志功能有哪些? 记录日常操作和错误信息,以便了解Mysql数据库的运行情况,日常操作,错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份:全部都备份一遍表备份:只提取数据库中的数据࿰…...
私有库gitea安装
一 gitea是什么 Gitea是一款自助Git服务,简单来说,就是可以一个私有的github。 搭建很容易。 Gitea依赖于Git。 类似Gitea的还有GitHub、Gitee、GitLab等。 以下是安装步骤。 二 安装sqilite 参考: 在windows上安装sqlite 三 安装git…...
关于最近win11不能使用ie,而不能使用考试客户端的解决方法
弄ie的那个我感觉是非常难的,所以我的是另一种的方法 下载360浏览器(不是360全家桶)360安全浏览器-全面保护上网安全,4亿用户共同选择(上面的是官网,不要下载错了,还有安装界面注意不要勾选一下…...
深度学习之Mask-R-CNN
1.1 Mask-RCNN 的网络结构示意图 其中黑色部分为原来的Faster-RCNN,红色部分为在Faster网络上的修改: 1)将ROI Pooling层替换成了ROIAlign; 2)添加并列的FCN层(Mask层); …...
css包含块
包含块 出现 在css中一些属性的计算可能超出你的预料,在普遍情况下会认为定位属性和百分比的宽高是根据父元素计算的,但是准确来说他们都是根据元素所在的包含块来计算的,所以掌握包含块的知识是非常关键的。 内容 在CSS中,“…...
混沌工程/混沌测试/云原生测试/云平台测试
背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …...
研发设计数字化:PLM、PDM、ERP介绍及其区别
一、产品全生命周期管理的定义 1.1 产品全生命周期(PLM)发展背景 目前,数字化设计与制造的技术(如CAX、DFX等)已经在产品开发中得到广泛应用,而各种企业和产品管理软件(如ERP、SCM、PDM、CRM等…...
Python练习51
Python日常练习 题目: 调用函数fun判断一个三位数是否“水仙花数”。 在main函数中从键盘输入一个三位数,并输 出判断结果。请编写fun函数。 说明: 所谓“水仙花数”是指一3位数,其各位数字立方和 等于该数本…...
Qt 前置课程 QtNFC
文章目录 详解 Qt NFC 模块(QtNFC)1. 什么是 NFC?2. NFC 的原理2.1 主动设备与被动设备2.2 三种工作模式2.3 数据交换 3. QtNFC 模块概述4. 使用 QtNFC 模块4.1 配置 .pro 文件 5. NFC 的常见应用场景6. QtNFC 模块的主要类6.1 QNearFieldMan…...
【论文阅读】 Learning to Upsample by Learning to Sample
论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程(1)初步设计(2)第一次修改(3)第二次修改(4)第三次修改 六、DySample四种变体七、复…...
堆排序(含证明)
引言 前面我们讲过堆的基本操作的实现,现在给定一个int类型的数组,里面存放的数据是无序的,我们如何利用堆的思想来实现数组内数据的升序排列或降序排列呢? 通过前面讲到的堆的实现,我们可以想到,我们再开…...
蓝桥杯模拟题不知名题目
题目:p是一个质数,但p是n的约数。将p称为是n的质因数。求2024最大质因数。 #include<iostream> #include<algorithm> using namespace std; bool fun(int x) {for(int i 2 ; i * i < x ; i){if(x % i 0)return false;}return true; } int main() …...
C#中的工厂模式
在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…...
深度学习与持续学习:人工智能的未来与研究方向
文章目录 1. 持续学习与深度学习1.1 深度学习的局限1.2 持续学习的定义 2. 目标与心智2.1 奖励假说2.2 心智的构成 3. 对研究方法的建议3.1 日常写作记录3.2 中立对待流行趋势 1. 持续学习与深度学习 1.1 深度学习的局限 深度学习注重“瞬时学习”,如ChatGPT虽在语…...
OGRE 3D----4. OGRE和QML共享opengl上下文
在现代图形应用开发中,OGRE(Object-Oriented Graphics Rendering Engine)和QML(Qt Modeling Language)都是非常流行的工具。OGRE提供了强大的3D渲染能力,而QML则用于构建灵活的用户界面。在某些应用场景中,我们需要在同一个应用程序中同时使用OGRE和QML,并且共享OpenGL…...
【Umi】常用配置
具体见:alias 1. 基础配置 1)配置别名alias 2)配置sourcemap devtool 配置项 3)添加hash 4)图片转base64 inlineLimit 配置项 5)设置JS压缩方式 jsMinifier (webpack) 、jsMinifierOptions 配置项 6)设置umi插件 plugins 配置项 7)设置打包后资源导入的路…...
Windows加固脚本
echo off REM 清屏 cls title 安全策略设置批处理 color f0 echo **************************************** echo write by afei echo https://www.jianshu.com/u/ea4c85fbe8c7 echo **************************************** pause cls color 3f echo ********************…...
玩游戏常常出现vc++runtime library error R6025 这是什么意思,该怎么解决?
当玩游戏时常常出现“vc runtime library error R6025”错误,这通常表明微软C开发运行库组件存在问题。以下是对该错误及其解决方法的详细解释: 错误含义 “vc runtime library error R6025”是一个与Visual C运行时库相关的错误,该错误表明…...
从Arduino到STM32:GRBL固件选型、下载与刷写全攻略(2024版)
从Arduino到STM32:2024年GRBL固件选型与刷写实战指南 在DIY激光雕刻机和CNC设备的构建过程中,控制器的选择与GRBL固件的配置往往是决定项目成败的关键环节。面对市场上琳琅满目的硬件平台——从经典的Arduino Uno到性能更强的STM32系列开发板࿰…...
如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战
如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战 【免费下载链接】lightnovel-crawler Generate and download e-books from online sources. 项目地址: https://gitcode.com/gh_mirrors/li/lightnovel-crawler Lightnovel-crawler是一款强大的轻小说…...
探索War3编辑器(7):从触发器GUI到JASS脚本的进阶实践
1. 为什么需要从GUI转向JASS脚本 很多War3地图作者刚开始都会使用图形化触发器界面(GUI)来制作游戏逻辑,毕竟点点鼠标就能完成功能确实很方便。但当你想要实现更复杂的效果时,比如循环判断系统、动态技能机制或者高级AI行为&#…...
基于Python的分布式抖音内容下载引擎:架构解析与技术实现
基于Python的分布式抖音内容下载引擎:架构解析与技术实现 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
如何在老旧电视上实现流畅的1080P直播?MyTV-Android原生应用深度解析
如何在老旧电视上实现流畅的1080P直播?MyTV-Android原生应用深度解析 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否曾为家中老旧智能电视的卡顿直播体验而烦恼&#x…...
QUdpSocket 性能调优与零丢包实践
1. QUdpSocket性能瓶颈深度解析 第一次用QUdpSocket接收传感器数据时,我盯着监控屏幕上跳动的丢包统计数字,后背直冒冷汗——每秒2000个数据包竟然丢了近三成!这种经历恐怕很多做过工业物联网开发的同行都遇到过。QUdpSocket作为Qt框架中的U…...
WinForm + Modbus 上位机温湿度数据采集系统
前言工业自动化和环境监控领域,实时掌握现场的温湿度数据至关重要。传统的监控方式往往依赖人工记录或简单的报警装置,缺乏直观性和连续性。本文推荐一个基于WinForm开发的上位机温湿度采集系统,通过Modbus通信协议与下位机进行数据交互&…...
CoPaw智能体工厂:基于三层策略与安全协议的自动化创建工具
1. 项目概述:一个为CoPaw智能体平台量身定制的“智能体工厂”如果你正在使用CoPaw(或者更广为人知的AgentScope)来构建和管理你的AI智能体,那么你肯定遇到过这样的场景:每次想创建一个新的智能体工作区(wor…...
AIAgent系统崩溃前的7个征兆:基于SITS2026容错框架的实时预警与自愈方案
更多请点击: https://intelliparadigm.com 第一章:SITS2026容错框架的理论根基与演进脉络 SITS2026(Self-Integrating Tolerance System 2026)并非凭空而生,其设计深度植根于分布式系统可靠性理论、形式化验证方法论与…...
AI编码助手经验治理:ExperienceEngine解决重复错误与智能进化
1. 项目概述:为编码智能体引入“经验治理层”如果你和我一样,长期使用像 Claude Code、Cursor 或 OpenClaw 这类 AI 编码助手,肯定会遇到一个让人头疼的问题:同一个项目里,AI 助手会反复犯下几乎一模一样的错误。比如&…...
