我的应用程序显示'老一代'/'终身代'的尺寸上升,当达到'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日:有人可以请注意“老一代”被垃圾收集时会发生什么? 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)
答案 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