Java HotSpot 1.6虚拟机,垃圾收集-可怕的PermGen

7

我的应用程序显示出“老年代”/“终身代”大小上升的情况,当这达到“老年代”的最大限制时,PermGen大小会突然增加。 以下是我的代大小:

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC

这是在32位的Fedora上,所以无法拥有比这更大的堆。
该应用程序没有进行任何花哨的类加载,但是它使用了Spring IOC和Hibernate,Spring App-context.xml定义了大约1000个Bean。
该应用程序从175MB PermGen启动,稳定地增加到几个小时后的~250MB,并保持这种状态直到Tenured Generation达到~780 MB,然后PermGen跳到~500MB,而Old Gen则下降到~500MB。
这迫使我每天重新启动应用程序,并让我真正担心即将出现OutOfMemory错误。任何见解都将非常有帮助。
谢谢 Gala101
5月13日:请问当“Old Gen”被垃圾回收时会发生什么?JVM是否将“Old Gen”的集合放入PermGen中?我的PermGen峰值仅在从“Old Gen”进行收集时出现,而OldGen大小的减少与PermGen大小的增加密切相关。 PS:我不进行任何实时部署/卸载,因为那肯定会耗尽PermGen。 以下是来自我的监视页面的当前快照:(已分配的部分刚刚从~250 MB跳到500 MB)
    PS Perm Gen
Type    Non-heap memory
Usage   init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Peak Usage  init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Collection Usage    init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K)

据我所知,MaxPermSize不能超过256MB... - Bozhidar Batsov
1
@Bozhidar:不是这样的,PermGen大小可以比那个大得多。 - skaffman
3个回答

2
我会遵循leonm的建议,分析占用大量内存的原因。我猜测你可能存在某种讨厌的内存泄漏问题。
你说你不使用任何高级类加载器,但Hibernate会为你动态生成一些类。你是否使用了某些AOP功能(例如Spring AOP模块)?
基本上,如果你的PermGen空间不足,那么似乎你的应用程序不断产生新的类(因为它是将类存储在PermGen中)。

今晚我会尝试使用jmap并进行更新。 我们没有使用Spring AOP,但是使用了很多Spring beans(这些应该是单例的,不确定它们是否是一个因素)。 此外,您或其他人能否解释一下当“Old Gen”进行垃圾回收时会发生什么? JVM会将“Old Gen”中的集合放入PermGen吗? 我的PermGen峰值仅在从“Old Gen”进行收集时出现,而且OldGen大小的减小与PermGen大小的增加非常相似。 - Gala101

0

在重启服务器之前,使用jmap进行内存转储,并使用Eclipse MAT进行分析。


0

我从未在正在运行的Tomcat上重新部署过,很抱歉之前没有提到。 - Gala101
PermGen主要有类定义。我想知道你是做什么样的应用程序? - Ram

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