JDK1.8为什么使用元空间代替了永久代

简介: JDK1.8为什么使用元空间代替了永久代

JDK 1.8中元空间的引入

在JDK 1.8中,元空间(Metaspace)被引入作为替代永久代(PermGen,Permanent Generation)的一部分内存模型的改变。这一改变主要是基于以下几个原因:

1. 永久代的限制

「永久代」是Java堆的一部分,用于存储类的元数据、静态变量和JVM内部用于类和方法的数据结构。它有一个固定的大小,当应用程序加载了大量的类或者大量使用反射时,永久代很容易发生溢出。这种溢出会导致OutOfMemoryError异常,而调整永久代的大小需要手动设置JVM参数(如-XX:PermSize-XX:MaxPermSize),这不仅增加了配置的复杂性,而且在不同的场景下需要不断调整,给开发和运维带来了不便。

2. 垃圾收集的复杂性

永久代的垃圾收集比较复杂,因为它涉及到类的卸载,而类的卸载又和类加载器有关。在某些情况下,即使类不再被使用,但由于类加载器的存在,类也不会被卸载,从而导致内存泄漏。此外,永久代的垃圾收集通常与Java堆的其他部分分开进行,增加了垃圾收集器的实现复杂性。

3. 向操作系统的内存模型靠拢

「元空间」使用本地内存(也就是操作系统的内存),而不是JVM堆内存。这样做的好处是元空间可以动态地根据应用程序的需求扩展大小,而不需要像永久代那样设置一个固定的大小。这种方式更加灵活,可以减少因为永久代大小不当设置导致的内存错误。

4. 性能优化

使用元空间代替永久代还有助于性能优化。因为元空间是基于本地内存的,它的扩展通常比永久代更快,且不受JVM堆大小的限制。这意味着元空间可以更快地响应类加载的需求。

5. 与HotSpot JVM的兼容性

Oracle希望通过引入元空间,简化HotSpot JVM的维护和开发,因为这样可以移除与永久代相关的代码,使得JVM的内存管理更加简洁。

结论

总的来说,「元空间」的引入是为了解决永久代固有的一些问题,如内存空间限制、垃圾收集的复杂性以及性能问题。通过使用元空间,JVM的内存管理变得更加灵活和高效,同时简化了JVM的维护工作。

相关文章
|
6天前
|
Java
JVM之本地内存以及元空间,直接内存的详细解析
JVM之本地内存以及元空间,直接内存的详细解析
41 0
|
6天前
|
存储 监控 算法
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程
|
6天前
|
存储 Java 编译器
方法区、永久代、元空间之间有什么关系
方法区、永久代、元空间之间有什么关系
|
10月前
|
存储 Java 程序员
【JVM】方法区与永久代、元空间之间的关系
【JVM】方法区与永久代、元空间之间的关系
118 0
|
9月前
|
存储 算法 Java
JVM 收集算法 垃圾收集器 元空间 引用
JVM 收集算法 垃圾收集器 元空间 引用
75 0
|
10月前
|
Java
新生代、老年代、永久代的区别?
新生代、老年代、永久代的区别?
186 0
|
10月前
|
算法 安全 Java
JVM学习日志(十一) 对象进入老年代的情况 及 空间担保机制
对象进入老年代的情况 及 空间担保机制 简述
360 0
JVM学习日志(十一) 对象进入老年代的情况 及 空间担保机制
|
存储 算法 安全
【垃圾回收器、垃圾回收算法、空间分配担保】
【垃圾回收器、垃圾回收算法、空间分配担保】
|
设计模式 消息中间件 运维
为什么用元空间替代永久代?
为什么用元空间替代永久代?
179 0
|
缓存 算法 Java
十分钟掌握JVM内存分配、垃圾收集器和常用参数
十分钟掌握JVM内存分配、垃圾收集器和常用参数
124 0
十分钟掌握JVM内存分配、垃圾收集器和常用参数