方法区是jvm线程共享区域,存储类元数据、运行时常量池(除字符串常量外)、静态变量引用、jit编译代码及类加载器引用等,支撑类加载与反射机制。

方法区是 JVM 中所有线程共享的内存区域,主要存放与类相关的静态结构信息,不是用来存运行时对象的——对象都放在堆里。
类的元数据(Class Metadata)
这是方法区最核心的内容,包括:
- 类的全限定名、父类名、实现的接口列表
- 字段信息:名称、类型、修饰符(如 public static final)
- 方法信息:签名、返回类型、参数、字节码指令(Method Bytecode)
- 访问标志(access flags),比如是否是 interface、abstract 或 final
运行时常量池(Runtime Constant Pool)
每个类或接口在加载时都会生成一个运行时常量池,它是 class 文件中常量池的运行时表现形式,包含:
- 字面量:字符串常量(如 "hello")、基本类型常量(如 100、true)
- 符号引用:类和接口的全限定名、字段和方法的名称与描述符
注意:JDK 7 起,字符串常量池已从方法区移到堆中;但其他字面量和符号引用仍保留在方法区(元空间)内。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
静态变量(Static Variables)
类中定义的 static 字段(非 final 基本类型或字符串)的引用本身存于方法区,但其实际值存储位置有变化:
- JDK 7 及以前:静态变量与类元数据一起存在永久代
- JDK 8 起:静态变量被移到堆中,方法区(元空间)只保留变量的引用和描述信息
即时编译代码与类加载器引用
方法区还保存:
- JIT 编译器生成的本地机器码(热点方法优化后的代码)
- 指向该类所用类加载器的引用,用于判断类是否可卸载
- 域和方法的访问控制信息(如 ACC_PRIVATE 标志)
这些内容共同支撑类的加载、链接、初始化及后续调用,是 Java 动态性与反射能力的基础支撑。不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










