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 日:有人能解释一下“老一代”被垃圾收集时会发生什么吗?
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)
4

3 回答 3

2

我会按照 leonm 的建议来分析什么需要这么多内存。我敢打赌你有某种令人讨厌的内存泄漏。

你说你不做任何花哨的类加载,但 Hibernate 会为你动态生成一些类。你是否使用了一些 AOP 特性(例如来自 Spring AOP 模块?)。

基本上,如果您的 PermGen 空间不足,那么您的应用程序似乎会继续生成新的类(因为它是存储在 PermGen 中的类)。

于 2010-05-12T21:50:58.573 回答
0

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

于 2010-05-11T10:49:42.093 回答
0

如果您继续在应用服务器上部署/取消部署应用程序,Permgen 就会泄露。

检查此链接以获取更多说明,这不是应用服务器的错。

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

于 2010-05-13T08:20:05.777 回答