0

我在我的应用程序中使用 Tomcat 6、springs、hibernate 和 struts。我经常在有关内存的日志中收到此异常,并且该站点挂起并停止响应。我不确定出了什么问题。任何人都可以建议必须做哪些改变来避免这种情况。

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

4

2 回答 2

2

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

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

-XX:MaxPermSize=SIZE 但是我发现最好的办法是让类被卸载,这样你的 PermGen 永远不会用完:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 类似的东西过去对我很有效。有一件事,在使用这些时有一个显着的性能权衡,因为 permgen 扫描会为你提出的每个请求或类似的东西发出额外的 2 个请求。您需要在使用与权衡之间取得平衡。

于 2013-08-16T08:39:05.250 回答
0

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

编辑:尝试增加 Tomcat 内存。默认情况下,它以 256 MB 开头。如果您使用的是 Windows,则可以通过配置 Tomcat 进程设置来完成此操作。参考下面的帖子。 作为 Windows 服务运行时,如何增加 Tomcat 7 的内存?

于 2013-08-16T08:14:26.043 回答