Java HotSpot 1.6 VM,垃圾收集 - 可怕的PermGen

时间:2010-05-11 10:08:15

标签: java garbage-collection jvm permgen

我的应用程序显示'老一代'/'终身代'的尺寸上升,当达到'Old Gen'的最大限制时,突然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

13月5日:有人可以请注意“老一代”被垃圾收集时会发生什么?
jvm是否将“Old Gen”的藏品放入PermGen?
我的PermGen峰值仅在“Old Gen”收集时出现,OldGen尺寸的减少与PermGen尺寸的增加密切相关。
PS:我没有进行任何实时部署/取消部署,因为这肯定会占用PermGen 下面是我的监控页面中的当前spanshot :(承诺的部分刚刚从~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)

3 个答案:

答案 0 :(得分:2)

我会按照leonm的建议去分析那些需要大量记忆的东西。我打赌你有一些讨厌的内存泄漏。

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

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

答案 1 :(得分:0)

在重新启动服务器并使用Eclipse MAT

进行分析之前,请使用jmap执行内存转储

答案 2 :(得分:0)

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

检查此链接以获取更多解释,这不是应用程序服务器的错误。

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