JVM类加载==>类结构与.class文件字节码指令

一,类结构

himagic:魔数

minor_version 小版本号

major_version 主版本号

constant_pool_count 常量池

access_flags 访问修饰符(public)

this_class 类的包名,类名

super_class 父类

interfaces_count 接口信息

fields 成员变量,静态变量等变量信息

method 方法信息

attributes_count 附加属性

用一段代码:

编译成.class字节码文件就是这样(16进制)

一)魔数

二)版本信息

类中没有小版本号

00 34 是十六进制, 对应的十进制是52,52版本号对应Java8

三)常量池

下图简称图1

注意: 以下为16进制表示,每位代表一个二进制的4位(1111 = 16),所以两位就代表一个字节

常量池中存储34项内容

常量池的第一项0a的十进制是10,我们去图1中可以看到这是Methodref, 各用两个字节存储常量池的方法所属类,和方法名

构造方法

局部变量表

代表字符串

这三个代表方法的方法名,参数,返回值等信息

args参数的类型

方法参数

下面两个合在一起表示类的源文件是HelloWorld.Java

本类全限定名

父类全限定名

四)访问标识与继承信息

五)Field信息

六)附加属性

二,字节码指令

.java源代码被编译成二进制.class字节码文件, 那么源代码中的方法在.class文件中是怎么执行的呢?

下面有两个方法的二进制执行流程

init()方法

下图是一个Hello World类的构造方法,位于0000720行

jvm首先会在局部变量表中找到this, 放入操作数栈中

b7. 相当于 . 调用方法

00 01 调用父类的构造方法

官方文档里2a对应aload_0, b1对应return

main()方法

00 02 代表System类中的静态变量out, out的类型为PrintStream

相关推荐
用户0942485680343 分钟前
第22章:JIT编译分层——Interpreter、C1、C2与热点探测
java·jvm
乌暮2 小时前
JVM 原理与实践:从运行时数据区到线上故障排查
java·开发语言·jvm·后端·学习·面试
长河19 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
可乐ea1 天前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
一条破秋裤1 天前
Linux 线程同步:读写锁
java·linux·jvm
wuminyu1 天前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
一条破秋裤1 天前
Linux 线程同步:条件变量
java·linux·jvm
谢亮_vipxieliang1 天前
GC 入门:G1 与 ZGC 怎么选
java·jvm·算法
小溪学编程2 天前
从 C++ 的规范变迁看语言发展
jvm·c++·面试
晚安code2 天前
JVM 类加载机制详解:双亲委派模型的原理、优势与三种打破方式
jvm