Tomcat-PermGen空间异常



Iam在我的应用程序中使用Tomcat6、springs、hibernate和struts。我经常在关于内存的日志中遇到这个异常,站点挂起并停止响应。我不确定出了什么问题。有人能建议应该做些什么改变来避免这种情况吗。

org.apache.tomcat.util.threads.ThreadPool$ControlRunnable运行严重:执行org.apache.jk.com.mon.ChannelSocket时捕获异常(java.lang.OutOfMemoryError:PermGen空间)$SocketConnection@2c52d3,终止线程

PermGen空间是Tomcat用来存储类定义(仅定义,没有实例化)和已被interned的字符串池的空间。根据经验,PermGen空间问题往往会在开发环境中频繁发生,因为Tomcat每次部署WAR或执行jspc(编辑jsp文件时)都必须加载新的类。就我个人而言,当我进行开发测试时,我倾向于经常部署和重新部署wars,所以我知道我迟早会用完(主要是因为Java的GC周期仍然有点垃圾,所以如果你足够快速和频繁地重新部署war,空间就会比他们能管理的更快地填满)。

理论上,这在生产环境中应该不是什么问题,因为你(希望)不会在10分钟的基础上更改代码库。如果这种情况仍然发生,那就意味着你的代码库(以及相应的库依赖项)对于默认的内存分配来说太大了,你只需要处理堆栈和堆的分配。我认为标准是这样的:

-XX: MaxPermSize=大小然而,我发现最好的解决方法是允许卸载类,这样你的PermGen就永远不会用完:

-XX: +CMSClassUnloadingEnabled-XX:+CMSPermGenSweppingEnabled像这样的东西在过去对我来说很神奇。有一件事是,使用它们会带来显著的性能权衡,因为permgen扫描会为你发出的每个请求或类似的东西额外发出2个请求。你需要在使用和权衡之间取得平衡。

您的应用程序可能存在内存泄漏,或者Tomcat可能没有足够的内存来运行该应用程序。使用Yourkit等工具来检查您的内存使用情况。

编辑:尝试增加Tomocat内存。默认情况下,它以256 MB开始。如果您在Windows上,您可以通过配置Tomcat进程设置来实现这一点。请参阅下面的帖子。当作为Windows服务运行时,如何在Tomcat7上增加内存?

最新更新