
元空间 vs 永久代:方法区的演进与踩坑本文是《JVM调优实战》专栏第 7 讲。如果你在 JDK 7 时代做过 Java Web 开发,大概率遇到过java.lang.OutOfMemoryError: PermGen space。每次重新部署应用,PermGen 就涨一点,几次 redeploy 后直接 OOM——这是无数运维同学的噩梦。到了 JDK 8,永久代被移除,元空间(Metaspace)登场。PermGen space的报错消失了,但取而代之的是Metaspace的 OOM。问题并没有被消灭,只是换了形式。元空间为什么能取代永久代?它解决了什么问题,又带来了什么新坑?本章我们就把方法区的演进彻底讲透。方法区是什么《Java 虚拟机规范》中定义了方法区(Method Area)这个逻辑区域,用于存储以下内容:类元信息:类的全限定名、字段、方法、接口、父类等结构信息。运行时常量池:类编译后生成的常量池在运行时的体现,包括字面量和符号引用。静态变量:static修饰的变量(JDK 7 起移到了堆中,但逻辑上仍属方法区范畴)。JIT 编译代码:HotSpot 即时编译器编译后的本地代码缓存。