方法区是JVM中所有线程共享的逻辑内存区域,用于存储类型信息、运行时常量池、静态变量及JIT编译代码;JDK 8起由元空间实现,逻辑职责不变。

方法区(Method Area)是JVM规范中定义的一块逻辑内存区域,主要存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码等数据。它属于所有线程共享的内存区域,与堆一样,在JVM启动时创建,通常不参与常规的垃圾回收(但部分实现支持对无用类的卸载)。
类型信息(类/接口的元数据)
每个被加载的类或接口,其结构信息都保存在方法区中,包括:
- 类型的全限定名、父类的全限定名、实现的接口列表
- 类的访问修饰符(public、final、static等)
- 字段(Field)信息:名称、描述符、访问标志
- 方法(Method)信息:名称、描述符、访问标志、字节码、异常表、栈帧局部变量表大小等
- 类的初始化状态(未初始化、正在初始化、已初始化)
运行时常量池(Runtime Constant Pool)
它是每个类或接口的常量池在运行时的表现形式,包含编译期生成的各种字面量(如文本字符串、final常量值)和符号引用(类和接口的全限定名、字段名和描述符、方法名和描述符)。JDK 7起,字符串常量池从方法区移至堆中;JDK 8彻底取消永久代,改用元空间(Metaspace),而运行时常量池仍逻辑上属于方法区,实际分配在元空间或堆中(视内容类型而定)。
静态变量与类级别数据
类中声明的static字段(即类变量)存放在方法区中(注意:static final基本类型或字符串字面量可能被直接内联或进入常量池,不占独立存储空间)。这些变量随类加载而分配内存,随类卸载而释放(极少发生)。非static字段属于实例数据,存在堆中。
立即学习“Java免费学习笔记(深入)”;
即时编译器优化后的本地代码
当JIT编译器将热点字节码编译为本地机器码后,这部分代码也缓存在方法区(具体在HotSpot中存放于Code Cache,属于方法区的扩展区域)。它不属于Java字节码,但由JVM管理,支持高效执行。
基本上就这些。方法区的设计核心是“为类型生命周期提供统一、共享的元数据存储”,其物理实现随JVM版本演进变化较大(如PermGen → Metaspace),但逻辑职责保持稳定。










