我已经安装了JDK 8,并试图运行Eclipse。我收到以下警告信息:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0
忽略这个VM选项的原因是什么?
我已经安装了JDK 8,并试图运行Eclipse。我收到以下警告信息:
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m;
support was removed in 8.0
忽略这个VM选项的原因是什么?
当前回答
在Java 8中,PermGen空间被MetaSpace取代。PermSize和MaxPermSize JVM参数将被忽略,如果在启动时出现,则会发出警告。
类元数据的大部分分配现在都是从本机内存中分配的。 *用于描述类元数据的类已被删除。
旧的PermGen和新的MetaSpace之间的主要区别是,您不必强制定义内存使用的上限。您可以保持MetaSpace空间限制无限制。因此,当内存使用增加时,你不会得到OutOfMemoryError错误。相反,保留的本机内存增加到完全填满增加的内存使用。
您可以为MetaSpace定义最大空间限制,然后它将抛出OutOfMemoryError:元数据空间。因此,谨慎地定义这个限制是很重要的,这样我们就可以避免内存浪费。
其他回答
永久生成(PermGen)空间已经完全被移除,并被称为Metaspace的新空间所取代。删除PermGen的结果显然是PermSize和MaxPermSize JVM参数被忽略,你永远不会得到java.lang.OutOfMemoryError: PermGen错误。 JDK 8 HotSpot JVM现在使用本机内存来表示类元数据,称为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性能也得到了改进。更多的细节
在Java 8中,PermGen空间被MetaSpace取代。PermSize和MaxPermSize JVM参数将被忽略,如果在启动时出现,则会发出警告。
类元数据的大部分分配现在都是从本机内存中分配的。 *用于描述类元数据的类已被删除。
旧的PermGen和新的MetaSpace之间的主要区别是,您不必强制定义内存使用的上限。您可以保持MetaSpace空间限制无限制。因此,当内存使用增加时,你不会得到OutOfMemoryError错误。相反,保留的本机内存增加到完全填满增加的内存使用。
您可以为MetaSpace定义最大空间限制,然后它将抛出OutOfMemoryError:元数据空间。因此,谨慎地定义这个限制是很重要的,这样我们就可以避免内存浪费。