JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?

Java8移除永久代并引入元空间,主要是为了解决 PermGen 固定大小、容易导致内存溢出、GC 效率低的问题。元空间使用本地内存,具备更灵活的内存分配能力,提升了垃圾收集和内存管理的效率。

PermGen 的局限性

①固定大小:永久代的内存空间大小在 JVM 启动时是固定的,容易出现 内存溢出(OutOfMemoryError),尤其是在动态加载大量类时。

②类和方法的存储限制:永久代用于存放类的元数据(类信息、方法等),其容量受限,导致某些应用特别是在大量动态生成类或使用大量第三方库时,容易出现内存管理问题。

③GC 效率低:永久代内大部分存放的类的元数据是都是被使用的,不是垃圾对象,因此无法被回收,回收的效率很低。

Metaspace 的改进

①使用本地内存:元空间使用的是本地内存(Native Memory),而不是 JVM 的堆内存,这样使得内存的分配更加灵活,避免了 PermGen 固定大小带来的局限性。

②自动调整大小:元空间可以根据应用的需要自动扩展大小,从而降低了出现 OutOfMemoryError 的风险,提升了内存使用的灵活性和效率。

③性能提升:元空间(在堆外)减少了 GC 对类元数据的影响,避免了频繁回收 PermGen 时的停顿,改善了JVM 的整体性能。

相关推荐
wuminyu7 小时前
JDK21 FFM异步读取MSG_ZEROCOPY错误队列揭秘
java·linux·c语言·jvm·c++
YH552698419 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
2602_9599609221 小时前
谢飞机面试大厂:Spring Boot、JVM、Redis、Kafka、微服务与音视频搜索场景求生实录
java·jvm·spring boot·redis·面试题
wuminyu1 天前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
SWAGGY..1 天前
【C++进阶】:(1)继承机制详解
java·jvm·c++
一木 之林1 天前
三、内存管理、指针与堆栈
c语言·jvm·c++
2602_959960921 天前
Java大厂面试实录:Spring Boot、Redis、Kafka、Elasticsearch、分布式事务与云原生高并发系统
java·jvm·spring boot·redis·面试题
鱼鳞_1 天前
热门八股-JVM
java·jvm
studyForMokey1 天前
【Android 内存管理】JVM 内存模型与 GC 原理
android·jvm
城管不管2 天前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展