在达到 Max 之前 PermGen 空间不足

Posted

技术标签:

【中文标题】在达到 Max 之前 PermGen 空间不足【英文标题】:PermGen out of space before Max is reached 【发布时间】:2013-09-05 09:35:59 【问题描述】:

我使用 JPA/Hibernate 在 Tomcat 上运行 Java Web 应用程序,并且经常出现“PermGen out of space”。

谁能解释一下这个图形内存配置文件?

堆内存:我正在运行到最大值,但仍有一些空间(2.147.483.648 Max,但使用了 1.667.155.688)

非堆内存:大小正在下降 (94.568.448),而最大值允许增加 5 倍。这是“PermGen 空间不足”之前的快照(当 Size = Used 时)

我不明白这个配置文件。还剩下很多物理内存。

【问题讨论】:

【参考方案1】:

这是 Tomcat 经典问题之一。最好的答案之一在这里:

https://***.com/a/10392385/1314276

【讨论】:

由于我在 Hibernate 中使用 JPA,因此创建了很多类,这些类将数据放在非堆空间中。【参考方案2】:

Perm gen 空间不与 Heap 相交。您应该使用 -XX:PermSize 和 -XX:MaxPermSize 参数。

【讨论】:

这些参数正在使用中,但从未达到 MaxPermSize。保留的大小正在下降,以达到使用的大小,然后应用程序失败。【参考方案3】:

这个问题通常与一些内存泄漏有关。 PermGen 或永久代是堆的一部分,例如String 对象和Class 定义被分配。当堆和/或物理内存上仍有空间时,您很容易用完 PermGen。

您可以增加 perm gen 的大小,但在大多数情况下,它只会延长问题,因为您只会花一些时间。

我们需要查看导致此错误的代码,因为我们无法根据某些图表为您提供帮助。如果您不了解内存管理在 java 中的工作原理,这些链接可能会对您有所帮助:Jvm performance enhancements, Java garbage collector

【讨论】:

以上是关于在达到 Max 之前 PermGen 空间不足的主要内容,如果未能解决你的问题,请参考以下文章

内存不足:Permgen 空间 [重复]

JRuby PermGen 空间不足甚至在 ruby​​ 代码中使用 java 对象

我出现内存不足错误,如何解决?Permgen 空间区域是啥意思?是啥原因造成的? [复制]

PermGen space

如何减少 Grails 中 PermGen 空间的使用

Java内存不足报错:OutOfMemoryError:PermGen space