文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JVM高阶面试:Java8为什么使用元空间替换永久代?

2024-11-30 13:20

关注

方法区(Method Area)是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

具体来说,方法区用来存储以下数据:

  1. 类的元数据信息:包括类的名称、访问标志、父类、接口、字段、方法等信息。
  2. 运行时常量池:在Java代码中,常量可以被直接定义在类或接口中,这些常量在编译后被存储在Class文件的常量池中,而运行时常量池则是从Class文件中加载的。
  3. 静态变量和常量:类的静态变量和常量都存储在方法区中,它们在类加载的时候被初始化并分配内存空间。
  4. 方法字节码:在Java中,方法的字节码被编译成Class文件并存储在方法区中。
  5. 即时编译器(JIT)编译后的代码:为了提高程序的执行效率,JIT会将热点代码编译成本地机器码并存储在方法区中。

方法区只是 JVM 规范中定义的一个概念,针对 Hotspot 虚拟机,Java8 之前使用永久代(Permanent Generation,简称 PermGen)实现,而 Java8 之后使用元空间(Metaspace)实现。

JDK8 之前可以通过 -XX:PermSize 和 -XX:MaxPermSize 来设置永久代大小,JDK8 之后,使用元空间替换了永久代,改为通过 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize 来设置元空间大小。

2. 永久代问题

2.1 内存溢出

永久代的空间是有限制的,可以通过 -XX:PermSize 设置永久代初始容量,通过-XX:MaxPermSize 设置永久代最大容量。

但是当加载过多的类或者常量的时候,就可能导致永久代的空间不足,抛出 java.lang.OutOfMemoryError: PermGen space 异常。尤其是web应用会使用很多框架,这些框架会动态加载很多基础类,更容易导致OOM。

2.2 垃圾回收效率低下

永久代中的类信息一般是在应用程序运行期间不会发生变化的,因此,如果开启了永久代的垃圾回收,就会造成大量的垃圾回收操作,导致垃圾回收效率低下,甚至会引起应用程序的暂停。

此外,由于永久代主要存放 JVM 加载的类信息等永久存在的数据,这使得它在垃圾回收过程中的回收效率相对较低。在某些情况下,频繁触发的 Full GC 不仅无法有效回收永久代空间,还会严重影响 JVM 的性能。

2.3 无法动态调整大小

永久代的大小一旦被设置,就无法动态调整,如果预估错误,就可能导致浪费内存或内存不足的问题。

2.4 无法回收常量池中的内存

在永久代中,常量池是一个非常重要的部分,但是其中的常量无法被回收,即使这些常量已经不再被使用,也无法被垃圾回收器回收,这会浪费内存。

3. 元空间简介

元空间(Metaspace)是 Java8 中引入的一个新概念,用来替代原来的永久代。与永久代不同,元空间并不在虚拟机中,而是存储在本地内存(Native Memory)。

从 Java7 已经开始逐步移除永久代,在Java7中把 interned Strings 、 class statics 和 String Pool 从永久代移到堆中。在 Java8 中彻底移除了永久代,把将类的元数据信息、常量、静态变量、即时编译器编译后的代码从永久代中移到了元空间中。

4. 元空间的优点

与永久代相比,使用元空间使用方法区具有以下优点:

5. 元空间问题

尽管元空间解决了永久代的一些问题,可能也同时引入了一些新问题:

因此,虽然元空间为 JVM 的内存管理带来了新的可能,但也带来了新的挑战。为了充分利用元空间的优势,开发者需要理解其工作原理,掌握正确的使用和调优方法。

6. 总结

Java8 选择使用元空间(Metaspace)替代永久代(PermGen)是 JVM 内存模型的一次重大改进。解决了永久代面临的空间限制、低效的垃圾回收、以及复杂的内存管理等问题。元空间利用本地内存,能够动态调整大小,提供了更大的空间来存储类元数据,也更好地适应了大型、模块化应用的需求。

但是元空间也引入了一些新问题。如何避免本地内存溢出,如何制定有效的内存管理和调优策略,都是开发者需要重新考虑的问题。

来源:一灯架构内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯