在Tomcat 6中重复出现“PermGen”

我在Tomcat 6服务器上遇到“PermGen”错误。

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

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

谢谢

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

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

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

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

尝试以下JVM切换器:

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

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

请参阅此评论: 如何处理“java.lang.OutOfMemoryError:PermGen space”错误

这间接指向了我这两个post: 问题 , 解决方案

试试这个:在Linux机器上

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

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

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

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