-XX:MaxPermSize是做什么的?

306

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

此外,如果能指向JVM参数文档的答案会加分...


http://mark.koli.ch/2009/01/understanding-javas-perm-gen-maxpermsize-heap-space-etc.html - Paul Tomblin
7
请访问以下链接以获取有关Java虚拟机选项的信息:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html。现在,您会如何给我那些奖励分呢? :) - Denys Séguret
1
@PaulTomblin 我不确定你链接的那个人(Google 的第一个结果)对他所说的内容了解多少。 - Denys Séguret
@dystroy 我可以给你发送一个 cookie 吗?或者你可以为成功回答问题而感到满意 ;) - Zefira
6
这并没有具体回答问题,但如果您想了解JVM内存管理,我读过的最好的文章是this和这个infoq链接 - Abe
3个回答

313

永久代是虚拟机(VM)存储类、方法、内部化字符串和类似对象的空间,这些对象不会被回收(因此得名“permanent space”)。

这篇Oracle文章简洁地介绍了HotSpot GC的工作方式和参数设置,并建议在加载许多类的情况下增加永久代的大小(这通常是应用程序服务器和一些IDE如Eclipse的情况):

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

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

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


97

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

永久代:永久代是存放类文件的地方。这些文件是编译后的类和JSP页面的结果。如果该空间已满,会触发Full Garbage Collection操作。如果Full Garbage Collection无法清理旧的未引用类并且没有足够的空间来扩展永久代空间,则会抛出内存不足错误(OOME)并导致JVM崩溃。


2
这不是在 JDK > 8 或者从 JDK 11 开始在所有 VM 中移除了吗? - Ewoks

59

在Java 8中,该参数通常用于打印类似以下的警告信息:

Java HotSpot(TM) 64-Bit Server VM 警告: 忽略选项 MaxPermSize=512m;在 8.0 版本中已删除支持。

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

提示:关于Metaspace的文章:http://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html


7
另请参见:JDK 8中的PermGen消除(stackoverflow)。 - will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接