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