Java 8从永久代到metaspace(内存)

Java 8移除了永久代,引入了Metaspace作为类元数据的新存储区。Metaspace位于本地内存中,避免了 PermGen space问题,但依然需要关注其内存占用和调优。Metaspace的大小默认依赖于操作系统,可通过-XX:MaxMetaspaceSize进行配置。垃圾收集会在达到MaxMetaspaceSize时触发,过度的垃圾收集可能表明内存泄露。Metaspace由元空间虚拟机管理,其内存分配由类加载器决定,当类加载器被回收时,对应的元数据也会被回收。
摘要由CSDN通过智能技术生成



       Java 8完全移除了永久代(PermGen),自从Oracle公司发布了JDK1.7后就已经宣布了这个决定。还有比如内部字符串,从JDK1.7开始就从持久代移除了,JDK8的发布彻底废除了它。Metaspace成为了持久代的继任者。
      这项改动是很有必要的,因为对永久代进行调优是很困难的。永久代中的元数据可能会随着每一次Full GC发生而进行移动。并且为永久代设置空间大小也是很难确定的,因为这其中有很多影响因素,比如类的总数,常量池的大小和方法数量等。
       同时,HotSpot虚拟机的每种类型的垃圾回收器都需要特殊处理永久代中的元数据。将元数据从永久代剥离出来,不仅实现了对元空间的无缝管理,还可以简化Full GC以及对以后的并发隔离类元数据等方面进行优化。

       JDK8 HotSpot JVM现在使用了本地内存(与堆不相连的本地内存区域)来存储类元数据,被称为Metaspace,和Oracle JRockit以及IBM JVM类似。
       它意味着java.lang.OutOfMemoryError:PermGen space问题会越来越少,也不再需要去调整和监控内存空间。然而这种变化默认是可不见的,接下来我们给你展示的,是你仍然需要关注类元数据内存占用。 请记住,这些新特点并不会很神奇的消除类和类加载器的内存泄露。你需要使用不同的方法和学习新的命名约定来找出问题的根源。

       持久代这块内存区域被完全移除,PermSize和MaxPermSize JVM 参数会被忽略,并且在启动的时候会给出警告信息。
       Metaspace容量:默认的,元数据分配限制于可用的本地内存 (容量大小依赖于操作系统可用虚拟内存)。可以使用-XX:MaxMetaspace

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值