-XX:MaxPermSize是做什么的?

具体来说,为什么它会帮助修复PermGen OutOfMemoryError问题?

此外,回答的奖励点,指向JVM参数的文档…

永久空间是VM使用的类,方法,内部化string和类似对象的存储位置,永远不会被释放(因此名称)。

这篇Oracle文章简洁地介绍了HotSpot GC的工作和参数化,并build议您在加载多个类(这通常适用于应用程序服务器和某些IDE(如Eclipse))时扩充此空间:

对于大多数应用来说,永久代对垃圾收集器的性能没有显着的影响。 但是,一些应用程序dynamic生成并加载许多类; 例如,一些JavaServer Pages(JSP)页面的实现。 这些应用程序可能需要更大的永久代持有额外的类。 如果是这样,可以通过命令行选项-XX:MaxPermSize =来增加最大永久生成大小。

请注意, 其他Oracle文档列出了其他HotSpot参数。

更新:从Java 8开始,permgen空间和这个设置都不见了。 用于加载的类和方法的内存模型是不同的,不受限制(使用默认设置)。 你不应该再看到这个错误。

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

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

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

Java HotSpot(TM)64位服务器VM警告:忽略选项MaxPermSize = 512m; 在8.0中删除了支持

你在Java 8中得到这个消息的原因是因为Permgen已经被Metaspace所取代,以解决PermGen的一些缺点(正如你自己看到的,其中一个缺点是它有一个固定的大小)。

仅供参考:有关Metaspace的文章: http ://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

MaxPermSize是永久生成堆的最大大小,它是一个包含类的字节码的堆,并且与包含实际实例的对象堆保持分离。