JVM系列之Metaspace

一、Metaspace介绍

    JDK 8 开始把类的元数据放到本地堆内存(native heap)中,这一块区域就叫 Metaspace,中文名叫元空间。
使用本地内存有什么好处呢?最直接的表现就是OOM问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制,也就是说本地内存剩余多少,理论上Metaspace就可以有多大(貌似容量还与操作系统的虚拟内存有关?这里不太清楚),这解决了空间不足的问题。不过,让 Metaspace 变得无限大显然是不现实的,因此我们也要限制 Metaspace 的大小:使用 -XX:MaxMetaspaceSize 参数来指定 Metaspace 区域的大小。JVM 默认在运行时根据需要动态地设置 MaxMetaspaceSize 的大小。

 

二、JDK1.7 和 JDK1.8 内存区别

  • 去除了PermGen,Native Memory中新增了Metaspace
  • 静态变量和常量移到了Heap Space
  • 类元数据移到了Metaspace

 

三、Metaspace 和 PermGen 比较

  PermGen的劣势

  • 固定的PermSize,大小很难确定并且很难进行扩展 -XX:MaxPermSize
    -XX:PermSize
  • 在进行full GC时PermGen中的class meta对象有可能会被移动
  • 发生java.lang.OutOfMemoryError: PermGen error时
    应用程序要清除与class关联的所有引用
    要么更改MaxPermSize重启应用
  • 需要meta-classmeta对象对classmeta对象进行描述
  • 垃圾回收效率较低,需要进行对整个PermGen进行扫描

Metaspace的优势

  • 类和类元数据的生命周期与类加载器一致
  • Metaspace的空间分配是线性的,可随类加载的数量进行线性的扩展,默认情况下只与native memory大小有关
  • 元数据的位置在native memory中的位置是固定的
  • GC时不会对metaspace空间进行扫描,节省了扫描和压缩的时间(如果设置了Metaspace的大小,当到达该Metaspace的阀值也会进行full GC)
  • 减小了full gc的时间
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值