我的应用程序显示“老一代”/“终身一代”的大小正在上升,当这个大小达到“老一代”的最大限制时,PermGen大小突然增加。以下是我的一代大小:
-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC这是在32位Fedora上的,所以不能有比这个更大的堆。
这个应用程序没有做任何花哨的类加载,尽管它使用的是Spring IOC和Hibernate,但Spring App-context.xml定义了大约1000个Beans。
这个应用从175MB的PermGen开始,在几个小时内稳定地增加到~250MB,一直保持到永久一代达到~780MB,然后permgen跃升到~500MB,而老一代下降到~500MB。
这迫使我每天重新启动应用程序,并让我真正害怕迫在眉睫的OutOfMemory错误。任何见解都会非常有帮助。
谢谢Gala101
13/5月:有人能解释一下当“老一代”被垃圾收集时会发生什么吗?
jvm会将'Old Gen‘中的集合放到PermGen中吗?
我的PermGen峰值只出现在从“老一代”收集的时候,OldGen大小的减少也与PermGen大小的增加密切相关。
PS:我不做任何实时部署/取消部署,因为这肯定会吞噬PermGen。
下面是来自我的监控页面的当前spanshot:(提交部分刚刚从~250MB跳到500MB)
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)发布于 2010-05-13 05:50:59
我会按照leonm的建议来分析是什么占用了这么多的内存。我敢打赌你一定有什么严重的内存泄漏。
您说您不做任何花哨的类加载,但是Hibernate会为您动态生成一些类。您是否使用了一些AOP特性(例如,来自Spring AOP模块?)
基本上,如果您耗尽了PermGen空间,那么您的应用程序似乎一直在生成新的类(因为它是存储在PermGen中的类)。
发布于 2010-05-11 18:49:42
在重新启动服务器并使用Eclipse MAT进行分析之前,使用jmap进行内存转储
发布于 2010-05-13 16:20:06
如果你一直在应用程序服务器上部署/取消部署应用程序,Permgen就会泄露。
请查看此链接,了解有关这不是应用程序服务器的错误的更多解释。
http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java
https://stackoverflow.com/questions/2809715
复制相似问题