spring - Tomcat - PermGen 空间异常

标签 spring hibernate tomcat memory

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

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

最佳答案

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

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

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

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 过去,类似的东西对我来说很神奇。有一件事,使用它们会产生显着的性能折衷,因为 permgen 扫描会为您发出的每个请求或类似的东西发出额外的 2 个请求。您需要权衡使用与权衡。

关于spring - Tomcat - PermGen 空间异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18268001/

相关文章:

jsp - 对于 Web 应用程序使用 jsp 或 servlet 哪个更快

java 将 hashmap 发送到 Freemarker 模板无法正常工作,未定义参数

spring - 在某个包中的所有 Controller 方法上预先设置 RequestMapping 的路径

java - 如果我为 transient 变量提供列标记,在 hibernate 中会发生什么?

java - 我应该在 spring 中为我的项目使用注释吗?

java - Tomcat8:404 错误,尽管 webapp 文件夹存在(dspace 实例)

java - 为什么 RESTcontroller 在 JSON 中多次返回相同的结果?

spring - 为什么在某些语言环境中未正确填写 Spring MessageSource 参数?

java - 与 Hibernate @LazyToOne 注释等效的 JPA 是什么?

tomcat - 如何在 solrconfig.xml 中指定分片编号/zookeeper 路径?