具体来说,为什么它会帮助修复一个永久生成出内存错误问题?

此外,对一个指向我的JVM参数文档的答案的加分…


永久空间是存放VM使用的类、方法、内部化字符串和类似对象的地方,永远不会被释放(因此得名)。

这篇Oracle文章简洁地介绍了HotSpot GC的工作和参数化,并建议您在加载许多类时增加这个空间(这通常是应用服务器和Eclipse等IDE的情况):

永久生成对垃圾没有明显的影响 大多数应用程序的收集器性能。然而,一些 应用程序动态地生成和加载许多类;例如, JavaServer Pages (JSP)页面的一些实现。这些 应用程序可能需要更大的永久生成来保存 额外的类。如果是这样,最大永久代大小可以 使用命令行选项-XX:MaxPermSize=增加。

注意,另一个Oracle文档列出了其他HotSpot参数。

更新:从Java 8开始,永久生成空间和这个设置都消失了。加载的类和方法使用的内存模型是不同的,并且没有限制(使用默认设置)。您不应该再看到这个错误了。

-XX:MaxPermSize用于设置永久生成的大小。

永久生成:永久生成是保存类文件的地方。这些是编译类和JSP页面的结果。如果此空间已满,则触发完全垃圾收集。如果完全垃圾收集无法清除旧的未引用类,并且没有剩余空间来扩展永久空间,则抛出内存溢出错误(out - of - Memory error, OOME), JVM将崩溃。

在Java 8中,该参数通常用于打印如下警告消息:

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