首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java HotSpot 1.6VM,垃圾收集-可怕的PermGen

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

Stack Overflow用户
提问于 2010-05-11 18:08:15
回答 3查看 6.4K关注 0票数 7

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

代码语言:javascript
复制
-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)

代码语言:javascript
复制
    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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-13 05:50:59

我会按照leonm的建议来分析是什么占用了这么多的内存。我敢打赌你一定有什么严重的内存泄漏。

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-05-11 18:49:42

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

票数 0
EN

Stack Overflow用户

发布于 2010-05-13 16:20:06

如果你一直在应用程序服务器上部署/取消部署应用程序,Permgen就会泄露。

请查看此链接,了解有关这不是应用程序服务器的错误的更多解释。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2809715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档