方法区存储类元数据、运行时常量池(非字符串类)、静态变量及jit编译代码;jdk 8+由元空间实现,使用本地内存,线程共享,oom异常为outofmemoryerror: metaspace。

方法区存的是类在运行时所需的“元数据”和共享资源,不是实例对象本身,而是让这些对象能被正确创建和调用的底层支撑信息。
类结构信息
包括类的全限定名、父类、实现的接口、字段(成员变量)定义、方法签名(名称+参数类型+返回值)、访问修饰符(public/private等)、构造器信息等。这些内容来自 .class 文件解析后的结果,是 JVM 理解“这个类长什么样”的基础依据。
运行时常量池
它是每个类或接口的常量池在运行时的表现形式,存储:
- 编译期生成的字面量:比如字符串字面量(String s = "abc" 中的 "abc")、final 基本类型常量(public static final int PORT = 8080)
- 符号引用:类和接口的全限定名、字段名与描述符、方法名与描述符等——这些在类加载初期用于动态链接,后续可能被解析为直接引用
注意:JDK 7 起,字符串常量池已从方法区迁移到堆中;JDK 8 后,运行时常量池保留在元空间,但只存非字符串类的符号信息和部分常量。
静态变量与类级别数据
所有用 static 修饰的变量(即类变量)都存放在此区域。它们在类初始化阶段被分配内存,并随类的生命周期存在。例如:
public static List
这里的 cache 引用本身 存在方法区,而它指向的 ArrayList 实例 仍位于堆中。
JIT 编译后的本地代码
HotSpot VM 的即时编译器(JIT)会将频繁执行的热点方法编译为本地机器码,这部分优化后的二进制指令缓存在方法区(元空间),供后续直接调用,跳过解释执行,提升性能。










