我在我的应用程序中使用Tomcat 6,spring,hibernate和struts。通常我在关于内存的日志中得到此异常,并且站点挂起并停止响应。我不确定什么是错的。任何人都可以建议做出哪些改变以避免这种情况。
org.apache.tomcat.util.threads.ThreadPool $ ControlRunnable run 严重:捕获异常(java.lang.OutOfMemoryError:PermGen空间)执行org.apache.jk.common.ChannelSocket$SocketConnection@2c52d3,终止线程
答案 0 :(得分:2)
PermGen空间是Tomcat用于存储类定义(仅限定义,无实例化)和已实例化的字符串池的空间。根据经验,PermGen空间问题往往在开发环境中经常发生,因为Tomcat必须在每次部署WAR或执行jspc(编辑jsp文件时)时加载新类。就个人而言,当我进行开发测试时,我倾向于大量部署和重新部署战争,所以我知道我迟早会跑出去(主要是因为Java的GC周期仍然有点废话,所以如果你快速和频繁地重新部署你的战争足够的,空间填充的速度超出了他们的管理范围。)
理论上,这应该不是生产环境中的问题,因为您(希望)不会在10分钟内更改代码库。如果它仍然发生,那只意味着你的代码库(和相应的库依赖项)对于默认的内存分配来说太大了,你只需要乱用堆栈和堆分配。我认为标准是这样的:
-XX:MaxPermSize参数= SIZE 然而,我发现最好的方法就是允许卸载类,这样你的PermGen就永远不会耗尽:
-XX:+ CMSClassUnloadingEnabled -XX:+ CMSPermGenSweepingEnabled 这样的东西在过去对我有用。有一点,在使用这些产品时会有显着的性能折衷,因为permgen扫描会对你提出的每个请求或类似的东西提出额外的2个请求。你需要平衡你的使用与权衡。
答案 1 :(得分:0)
您的应用程序可能有内存泄漏,或者您的Tomcat可能没有足够的内存来运行该应用程序。使用Yourkit等工具检查内存使用情况。
编辑:尝试增加Tomocat内存。默认情况下,它以256 MB开头。如果您使用的是Windows,则可以通过配置Tomcat进程设置来完成此操作。请参阅下面的帖子。 How do I increase memory on Tomcat 7 when running as a Windows Service?