Spring Tomcat-PermGen空间异常

Spring Tomcat-PermGen空间异常,spring,hibernate,tomcat,memory,Spring,Hibernate,Tomcat,Memory,我在应用程序中使用Tomcat6、springs、hibernate和struts。我经常在关于内存和站点挂起并停止响应的日志中看到这个异常。我不知道怎么了。有人能建议必须做些什么改变来避免这种情况吗 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable运行 严重:捕获到执行org.apache.jk.common.ChannelSocket的异常(java.lang.OutOfMemoryError:PermGen space)$S

我在应用程序中使用Tomcat6、springs、hibernate和struts。我经常在关于内存和站点挂起并停止响应的日志中看到这个异常。我不知道怎么了。有人能建议必须做些什么改变来避免这种情况吗

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

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

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

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

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

-XX:MaxPermSize=SIZE 但是,我发现最好的解决方法是允许卸载类,这样PermGen就不会用完:

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

根据您的建议所做的更改,几天之后将无法得到此错误。。。。。希望这一切能继续下去。thnx:)的可能重复项