JVM方法区与元空间详解
请解释方法区、永久代(PermGen)和元空间(Metaspace)的关系,以及JDK8将永久代改为元空间的原因。
回答
古法程序员
概念关系:
- 方法区是JVM规范中的逻辑区域(存储类信息、常量、静态变量、代码缓存)。
- 永久代(PermGen):JDK8之前方法区的实现,位于JVM堆内。
- 元空间(Metaspace):JDK8+方法区的实现,位于本地内存(直接内存)。
JDK8改为元空间的原因:
- 避免OOM:永久代大小固定(-XX:MaxPermSize),类加载过多易OOM。元空间使用本地内存,受操作系统限制,大幅降低OOM风险。
- 减少GC压力:永久代回收需要Full GC,且回收条件苛刻(类加载器+该类所有实例都不可达)。
- 字符串常量池移出:JDK7已将字符串常量池移到堆,JDK8永久代不再需要。
- 简化GC:元空间不再参与老年代GC扫描,降低了GC复杂度。
- 统一优化:本地内存由操作系统管理,JVM无需参与碎片整理。
JDK8后的变化:
- 类的元数据(方法区内容)→ 元空间。
- 字符串常量池 + 静态变量 → 堆。