方法区:类元数据的存储演变
引言:类信息存储在哪里? 当你写下一个类定义时: public class User { private static int count = 0; private static final String TYPE = "USER"; private String name; private int age; public void sayHello() { System.out.println("Hello"); } } 这个类的信息(字段、方法、常量)存储在哪里?答案是:方法区(Method Area)。 方法区是JVM规范中定义的一个 逻辑概念,用于存储 类信息、常量、静态变量、即时编译器编译后的代码 等数据。 为什么方法区很重要? 存储类的元数据,是类加载的基础 运行时常量池是方法调用的关键 JDK 8的元空间改造影响深远 方法区溢出是常见的OOM原因之一 什么是方法区? 核心定义 方法区(Method Area) 是《Java虚拟机规范》中定义的一个 逻辑概念,用于存储已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码 等数据。 关键特点: 线程共享:所有线程共享同一个方法区 逻辑概念:规范定义,具体实现由JVM决定 也称"非堆":与堆分开管理,但实际仍属于内存区域 可回收:方法区也会进行垃圾回收,但条件苛刻 方法区 vs 堆 对比维度 方法区 堆 存储内容 类信息、常量、静态变量 对象实例、数组 线程 线程共享 线程共享 GC 条件苛刻,效率低 频繁,效率高 溢出异常 OutOfMemoryError: Metaspace/PermGen OutOfMemoryError: Java heap space 大小 较小(通常几十MB到几百MB) 较大(通常几百MB到几GB) 方法区存储的内容 方法区主要存储以下4类数据: ...