285

具体来说,为什么它有助于解决 PermGen OutOfMemoryError 问题?

此外,对于将我指向有关 JVM 参数的文档的答案的奖励积分...

4

3 回答 3

297

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

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

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

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

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

于 2012-08-24T17:46:49.140 回答
96

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

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

于 2012-10-15T23:12:20.543 回答
56

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

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

您在 Java 8 中收到此消息的原因是因为 Permgen 已被 Metaspace 取代,以解决 PermGen 的一些缺点(正如您亲眼所见,其中一个缺点是它具有固定大小)。

仅供参考:关于元空间的文章: http ://java-latte.blogspot.in/2014/03/metaspace-in-java-8.html

于 2014-08-24T17:20:12.560 回答