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