在JDK 8中删除PermGen

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

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

忽略这个论点的原因是什么?

这是Java 8的新function之一,是JDK增强build议122的一部分 :

从热点JVM中删除永久代,因此需要调整永久代的大小。

将包含在Java 8中的所有JEP的列表可以在JDK8里程碑页面上find。

忽略这些争论的原因是永久代在JDK8的HotSpot中被删除,因为有以下缺点

  • 在启动时固定大小 – 难以调整。
  • 内部热点types是Java对象:可以移动完整的GC,不透明,不强types和难以debugging,需要元元数据。
  • 简化完整集合:每个收集器的元数据的特殊迭代器
  • 想要同时释放类数据而不是在GC暂停期间
  • 实现PermGen限制的未来改进。

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

MetaSpace的优势

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

元空间调整

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

更改将来会启用其他优化和function

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

还有改进的GC性能。 更多详情

由于PermGen空间被删除。 内存pipe理已经改变了一下。

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

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

Oracle针对Java 8的JVM实现摆脱了PermGen模型,并将其replace为Metaspace 。

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

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

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

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