在JDK 8中消除PermGen

问题描述 投票:207回答:6

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

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

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

java java-8 jvm permgen
6个回答
333
投票

忽略这些论点的原因是,由于以下缺点,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将根据运行时的应用程序需求动态调整大小。

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

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

GC性能也有提高。 qazxsw poi


113
投票

这是Java 8的新功能之一,是More detail的一部分:

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

可以在JDK Enhancement Proposals 122上找到将包含在Java 8中的所有JEP的列表。


18
投票

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


15
投票

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

Read More>>


11
投票

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

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

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

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


8
投票

Oracle的Java 8 JVM实现摆脱了PermGen模型并将其替换为http://java.dzone.com/articles/java-8-permgen-metaspace

© www.soinside.com 2019 - 2024. All rights reserved.