字节码转换为方法区数据是在类加载的“加载”阶段完成的,即解析校验.class文件、构建运行时结构并写入元空间,同时在堆中创建class对象作为访问入口。

Java 虚拟机把字节码转换成方法区数据,本质是类加载过程中的“加载”阶段完成的,不是运行时动态翻译,而是将 .class 文件的二进制内容按 JVM 规范解析、校验、组织后,存入方法区(Java 8+ 即元空间)。
这个过程不涉及“执行”或“编译成机器码”,而是结构化地载入类的静态元信息。关键步骤如下:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
字节码文件被读取并解析为运行时数据结构
- JVM 类加载器(如
BootstrapClassLoader)从磁盘、网络或内存中获取.class文件的二进制字节流; - 检查魔数(
0xCAFEBABE)、主次版本号(如major version: 52对应 JDK 8),确保兼容; - 解析常量池(Constant Pool):提取类名、父类、接口、字段名、方法签名、字符串字面量等符号引用;
- 构建类的运行时结构:包括类访问标志(
ACC_PUBLIC等)、字段表、方法表、属性表(如Code、LineNumberTable)。
类元信息写入方法区(元空间)
- 方法区存放的是类的模板信息,不是实例数据;
- 每个成功加载的类,在方法区中生成一份类型信息(Type Information),含:
- 完整的类全限定名、父类/接口索引;
- 已解析的字段和方法的结构(名称、描述符、访问修饰符、注解);
- 静态变量(
static字段)的初始值(注意:final static常量直接进常量池,非final的则在方法区分配空间并设默认值); - 指向常量池的引用、类加载器引用、指向其 Class 对象的指针(Klass Pointer);
- Java 8+ 中,这些数据存于本地内存的元空间(Metaspace),而非堆内永久代;
- 元空间大小可通过
-XX:MetaspaceSize和-XX:MaxMetaspaceSize控制,超限会抛OutOfMemoryError: Metaspace。
在堆中创建 java.lang.Class 对象作为访问入口
- 加载完成后,JVM 在堆内存中创建一个
Class实例(例如HelloWorld.class); - 这个对象不存类定义本身,而是作为方法区中该类元信息的句柄;
- 它包含一个
Klass*指针,指向方法区中对应的类元数据结构; - 所有反射调用(如
clazz.getDeclaredMethods())都通过这个Class对象间接访问方法区数据。
✅ 简单说:字节码 → 解析校验 → 组织成类结构 → 写入元空间(方法区)→ 堆中挂一个
Class对象作门牌号。整个过程发生在类首次主动使用(如new、调用静态方法、反射)前的加载阶段,由类加载器协作完成,无需人工干预。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










