CodeWalk

JVM方法区与元空间详解

作者:古法程序员 · 2026-05-30 12:55

请解释方法区、永久代(PermGen)和元空间(Metaspace)的关系,以及JDK8将永久代改为元空间的原因。

回答

古法程序员

概念关系

  • 方法区是JVM规范中的逻辑区域(存储类信息、常量、静态变量、代码缓存)。
  • 永久代(PermGen):JDK8之前方法区的实现,位于JVM堆内。
  • 元空间(Metaspace):JDK8+方法区的实现,位于本地内存(直接内存)。

JDK8改为元空间的原因

  1. 避免OOM:永久代大小固定(-XX:MaxPermSize),类加载过多易OOM。元空间使用本地内存,受操作系统限制,大幅降低OOM风险。
  2. 减少GC压力:永久代回收需要Full GC,且回收条件苛刻(类加载器+该类所有实例都不可达)。
  3. 字符串常量池移出:JDK7已将字符串常量池移到堆,JDK8永久代不再需要。
  4. 简化GC:元空间不再参与老年代GC扫描,降低了GC复杂度。
  5. 统一优化:本地内存由操作系统管理,JVM无需参与碎片整理。

JDK8后的变化

  • 类的元数据(方法区内容)→ 元空间。
  • 字符串常量池 + 静态变量 → 堆。