在JDK 8中消除PermGen

时间:2013-08-20 15:56:50

标签: java java-8 jvm permgen

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

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

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

6 个答案:

答案 0 :(得分:329)

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

  • 启动时的固定尺寸 - 难以调整。
  • 内部热点类型是Java对象:可以使用完整的GC移动,不透明,不强类型,难以调试,需要元元数据。
  • 简化完整集合:每个收集器的元数据特殊迭代器
  • 想要在GC暂停期间同时取消分配类数据
  • 启用受PermGen限制的未来改进。

永久生成(PermGen)空间已被完全删除,并被一个名为Metaspace的新空间所取代。 删除PermGen的后果显然是 PermSize和MaxPermSize JVM参数被忽略 ,你永远不会得到java.lang.OutOfMemoryError:PermGen错误。

MetaSpace的优势

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

元空间调整

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

更改将在未来启用其他优化和功能

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

还有改进的GC性能。 More detail

答案 1 :(得分:113)

这是Java 8的新功能之一,是JDK Enhancement Proposals 122的一部分:

  

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

可以在JDK8 milestones page上找到将包含在Java 8中的所有JEP的列表。

答案 2 :(得分:18)

永久生成(PermGen)空间已被完全删除,并被一个名为Metaspace的新空间所取代。删除PermGen的后果显然是忽略了PermSize和MaxPermSize JVM参数,你永远不会得到{ {1}}:PermGen错误。 JDK 8 HotSpot JVM现在使用本机内存来表示类元数据,称为Metaspace。 Read More>>

答案 3 :(得分:15)

因为PermGen空间被删除了。内存管理有所改变。

http://java.dzone.com/articles/java-8-permgen-metaspace

答案 4 :(得分:10)

PermGen空间由Java 8中的MetaSpace替换。将忽略PermSize和MaxPermSize JVM参数,并在启动时发出警告。

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

旧的PermGen与新的MetaSpace之间的主要区别在于,您不必强制定义内存使用的上限。您可以保持MetaSpace空间限制无限制。因此,当内存使用量增加时,您将无法获得OutOfMemoryError错误。而是增加保留的本机内存以完全填充增加的内存使用量。

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

答案 5 :(得分:8)

Oracle的Java 8 JVM实现摆脱了PermGen模型,并将其替换为Metaspace