在Tomcat 6中重复出现“PermGen”

时间:2009-01-23 14:11:52

标签: java memory tomcat

我的Tomcat 6服务器上出现“PermGen”错误。

我知道应用程序导致了什么问题,但我不确定它为什么会这样做。该应用程序使用MySQL 5并在JDK 6上运行。

是否有任何工具/建议可用于诊断或分析特定应用的基本问题?

由于

6 个答案:

答案 0 :(得分:25)

PermGen用于存储类定义和实习字符串池。您的代码可能正在填充它(如果它不必要地调用实习生),但更可能的是您的应用程序的默认值不足。

这是因为Tomcat将在每次部署WAR时加载新类 - 或者,如果您在开发环境中工作,则每次编辑JSP时都会加载。这些应该最终得到清理,但在活动的开发环境中,您可以拥有加载旧实例和新实例的时段。或者,如果您在生产环境中并拥有大型Web应用程序,则可能只需要更多空间。

要设置permgen大小,请使用-XX:MaxPermSize=SIZE

以下链接可能会有所帮助:tuning GC(这是1.5版),GC FAQ(1.4.2版),Hotspot VM options(我相信这是1.6)

答案 1 :(得分:13)

尝试以下JVM切换器:

-XX:+UseConcMarkSweepGC
-XX:+CMSPermGenSweepingEnabled
-XX:+CMSClassUnloadingEnabled

使用-XX:MaxPermSize提升permgen空间只会延误问题。

请看这条评论: How to deal with “java.lang.OutOfMemoryError: PermGen space” error

这间接指出了这两个帖子:problemsolution

答案 2 :(得分:3)

试试这个:在Linux机器上

export JAVA_OPTS="-XX:PermSize=128m"

答案 3 :(得分:2)

我认为你的应用程序中可能有很多JSP。 tomcat中存在一个已知问题,其中重新启动具有许多JSP的已部署应用程序会导致PermGen问题,因为tomcat会重新编译并重新加载所有这些类。如前一篇文章中所述,增加大小应该会有所帮助。

答案 4 :(得分:2)

我同意用-XX:MaxPermSize增加permgen空间只会延迟问题。我尝试增加permgen,然后在我向服务器发送更多请求后,我开始收到相同的错误。 建议使用-XX:+ CMSClassUnloadingEnabled等附加标志,即使它会稍微降低性能。

答案 5 :(得分:1)

在使用hibernate和spring进行代码更改后重新加载tomcat时,我看到了很多permgen错误,我认为这是因为logger / ehcache实例没有正常关闭。