JDK 8中的PermGen消除

我已经安装了JDK 8,并试图运行Eclipse。我收到以下警告信息:

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0

忽略这个VM选项的原因是什么?

194910 次浏览

Oracle的Java 8的JVM实现摆脱了PermGen模型,取而代之的是Metaspace

因为永久代空间被移除了。内存管理做了一些改变。

java-8-permgen-metaspace

这是Java 8的新特性之一,是JDK增强建议122的一部分:

从Hotspot JVM中删除永久生成,因此需要调优永久生成的大小。

Java 8中包含的所有jep的列表可以在JDK8里程碑页面中找到。

忽略这些参数的原因是,由于以下缺点,在JDK8的HotSpot中已经删除了永久生成

  • 启动时大小固定-难以调整。
  • 内部热点类型是Java对象:可以完全GC移动,不透明,不是强类型,很难调试,需要元-元数据。
  • 简化完整的集合:针对每个收集器的元数据的特殊迭代器
  • 希望同时释放类数据,而不是在GC暂停期间释放
  • 使未来的改进受到永久生成的限制。
永久生成(PermGen)空间已经完全被移除,并被一个叫做Metaspace的新空间所取代。 删除PermGen的结果显然是PermSize和MaxPermSize JVM参数被忽略,你将永远不会得到一个java.lang.OutOfMemoryError: PermGen错误

MetaSpace的优点

  • 利用Java语言规范属性:类和相关元数据生命周期匹配类装入器的生命周期
  • 每个加载器存储区域-元空间
  • 仅线性分配
  • 没有单独的回收(redefineclass和类加载失败除外)
  • 不进行GC扫描或压缩
  • 没有元空间对象的重定位

Metaspace调优

最大元空间大小可以使用-XX:MaxMetaspaceSize标志来设置,默认值是无限的,这意味着只有系统内存是限制。-XX:MetaspaceSize调优标志定义元空间的初始大小。如果不指定此标志,元空间将在运行时根据应用程序需求动态地重新调整大小。

更改可以在将来实现其他优化和特性

  • 应用程序类数据共享
  • 年轻集合优化,G1类卸载
  • 元数据大小减小和内部JVM占用空间项目

GC性能也得到了改进。更多的细节

永久生成(PermGen)空间已经完全被移除,并被一个叫做Metaspace的新空间所取代。删除PermGen的结果显然是PermSize和MaxPermSize JVM参数被忽略,你永远不会得到java.lang.OutOfMemoryError: PermGen错误。 JDK 8 HotSpot JVM现在使用本机内存来表示类元数据,称为Metaspace。< / >强阅读更多> >

在Java 8中,PermGen空间被MetaSpace取代。PermSize和MaxPermSize JVM参数将被忽略,如果在启动时出现,则会发出警告。

类元数据的大部分分配现在从本机内存中分配。 *用于描述类元数据的类已被删除

旧的PermGen和新的MetaSpace之间的主要区别是,您不必强制定义内存使用的上限。您可以保持MetaSpace空间限制无限制。因此,当内存使用增加时,你不会得到OutOfMemoryError错误。相反,保留的本机内存增加到完全填满增加的内存使用。

您可以为MetaSpace定义最大空间限制,然后它将抛出OutOfMemoryError:元数据空间。因此,谨慎地定义这个限制是很重要的,这样我们就可以避免内存浪费。