具体来说,为什么它会帮助修复一个永久生成出内存错误问题?
此外,对一个指向我的JVM参数文档的答案的加分…
永久空间是存放VM使用的类、方法、内部化字符串和类似对象的地方,永远不会被释放(因此得名)。
这篇Oracle文章简洁地展示了HotSpot GC的工作和参数化,并建议你在加载许多类时增加这个空间(这通常是应用服务器和一些IDE,如Eclipse):
永久生成对垃圾没有明显影响 大多数应用程序的收集器性能。然而,一些 应用程序动态地生成和加载许多类;例如, JavaServer Pages (JSP)页面的一些实现。这些 应用程序可能需要更大的永久生成来保存 额外的类。如果是这样,最大永久代大小可以 使用命令行选项-XX:MaxPermSize=.
注意,这是另一个Oracle文档列出了其他HotSpot参数。
更新:从Java 8开始,永久生成空间和这个设置都消失了。加载的类和方法使用的内存模型是不同的,并且没有限制(使用默认设置)。您不应该再看到这个错误了。
-XX:PermSize -XX:MaxPermSize用于设置永久生成的大小。
-XX:PermSize -XX:MaxPermSize
永久生成:永久生成是保存类文件的地方。这些是编译类和JSP页面的结果。如果此空间已满,则触发完全垃圾收集。如果完全垃圾收集无法清除旧的未引用类,并且没有剩余空间来扩展永久空间,则抛出内存溢出错误(out - of - Memory error, OOME), JVM将崩溃。
在Java 8中,该参数通常用于打印如下警告消息:
Java HotSpot(TM) 64位服务器虚拟机警告:忽略选项 MaxPermSize = 512;在8.0中删除了支持
Java HotSpot(TM) 64位服务器虚拟机警告:忽略选项 MaxPermSize = 512;在8.0
您在Java 8中得到这条消息的原因是因为Permgen已经被Metaspace所取代,以解决Permgen的一些缺点(正如您自己所看到的,其中一个缺点是它有固定的大小)。
供参考:一篇关于Metaspace: http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html的文章