在达到 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 空间不足的主要内容,如果未能解决你的问题,请参考以下文章
JRuby PermGen 空间不足甚至在 ruby 代码中使用 java 对象