首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试题21:什么是方法区?永久代?元空间?

面试题21:什么是方法区?永久代?元空间?

作者头像
爪哇缪斯
发布2023-05-09 21:37:07
发布2023-05-09 21:37:07
5210
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯
【方法区】
  • 逻辑上的东西,是JVM的规范,所有虚拟机必须遵守的
  • 是JVM 所有线程共享的、用于存储类信息,例如:类的字段方法数据方法代码、常量池等。
  • 方法区的大小决定了系统可以保存多少个类

【永久代】(JDK8之前)
  • -XX:PermSize

设置初始永久代大小。例如:-XX:PermSize=5m

  • -XX:MaxPermSize

设置最大永久代大小,默认情况下为64MB。例如:-XX:MaxPermSize=5m

  • 指内存的永久保存区域,主要存放Class和Meta(元数据)的信息,Class在被加载的时候被放入永久区域,它和存放实例的区域不同,GC不会在主程序运行期对永久区域进行清理。所以这也导致了永久代的区域会随着加载的Class的增多而胀满,最终抛出OOM异常。
  • 如果系统使用了一些动态代理,那么有可能会在运行时生成大量的类,从而造成内存溢出。所以,设置合适的永久代大小,对于系统的稳定性是至关重要的。

【元空间】(JDK8及之后)
  • -XX:MaxMetaspaceSize

设置元空间默认初始大小,默认为20.75MB。

例如:-XX:MetaspaceSize=40m

设置最大元数据空间。

例如:-XX:MaxMetaspaceSize=40m

  • 在Java8中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。
  • 元空间的本质和永久代类似,元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用堆外的直接内存
  • 因此,与永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存

【为什么使用元空间替换永久代?】
  • 表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。
  • 更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。由于永久代内存经常不够用或者发生内存泄露,爆出异常 java.lang.OutOfMemoryError: PermGen 。字符串存在永久代中,容易出现性能问题和内存溢出。类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则容易导致老年代溢出。永久代会位GC带来不必要的复杂度,而且回收效率偏低。Oracle可能会将HotSpot和JRockit合二为一。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【方法区】
  • 【永久代】(JDK8之前)
  • 【元空间】(JDK8及之后)
  • 【为什么使用元空间替换永久代?】
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档