【问题标题】:Tomcat - PermGen space ExceptionTomcat - PermGen 空间异常
【发布时间】:2013-08-18 13:06:53
【问题描述】:

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

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

【问题讨论】:

标签: spring hibernate tomcat memory


【解决方案1】:

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

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

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

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

【讨论】:

  • 按照您的建议进行了更改,并且从几天开始就会出现此错误.....希望这种情况继续下去。 thnx :)
【解决方案2】:

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

编辑:尝试增加 Tomcat 内存。默认情况下,它以 256 MB 开头。如果您使用的是 Windows,则可以通过配置 Tomcat 进程设置来完成此操作。参考下面的帖子。 How do I increase memory on Tomcat 7 when running as a Windows Service?

【讨论】:

    猜你喜欢
    • 2010-11-25
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2014-08-23
    • 2016-03-26
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多