【问题标题】:spring 3.1, hibernate 4, tiles2, tomcat 7 - cleanup (multiple deploys causing memory leaks)spring 3.1、hibernate 4、tiles2、tomcat 7 - 清理(多次部署导致内存泄漏)
【发布时间】:2012-01-11 02:56:59
【问题描述】:

在为我的 web 应用程序使用 spring、hibernate 和磁贴时,我似乎遇到了内存泄漏问题。我认为这可能是由于我的应用程序在部署之间没有自行清理造成的。我经常部署和取消部署,因为我目前只是在学习所有这些框架。

我应该做哪些事情来清理我的网络应用程序?我目前什么都不做,因为我认为 Java 会自动进行内存清理,但是我很确定它不会在 spring 中做所有事情,因为 tomcat 一直在抱怨 permgen 内存。

我对是否需要运行某些方法来保持清洁感到困惑。我读到了一个在某处注册应用程序的弹簧钩子,然后当它关闭时,应用程序是否被正确清理?我不确定在新版本的 spring (3.1) 中是否有必要这样做

例如,tomcat 一直告诉我我没有正确注销 JDBC 驱动程序(但我认为如果检测到 tomcat 会自动执行此操作)。

我知道这是一个非常模糊的问题,但如果有人可以提及某些需要做的事情以防止我的应用程序泄露,我可以自己用谷歌搜索。

谢谢!

【问题讨论】:

  • 会不会导致perm gen space错误?
  • 通过检查tomcat中是否有ERROR日志语句来判断部署是否正确。另外,如果tomcat 说JDBC 驱动没有正确注册,那就需要注意了。检查类路径中是否存在 jdbc 驱动程序库。

标签: hibernate spring tomcat memory-leaks tiles


【解决方案1】:

Hibernate 4.0 引入了 jboss-logging 作为依赖项,这似乎会导致 permgen 泄漏(请参阅 https://issues.jboss.org/browse/JBLOGGING-66)。

我不确定可以做些什么来正确修复它,但作为一种解决方法,将 jboss-logging jar 移动到 tomcats lib 目录似乎可行。

【讨论】:

    【解决方案2】:

    无论如何,在部署新版本之前,您应该尽可能长时间地关闭您的生产 tomcat。 (这需要有两个 tomcat 和故障转移机制,或者您只需接受服务停机时间长一秒钟,而不仅仅是更新。)

    据我所知,这是确保内存泄漏(也考虑 perm gen)不会造成任何有害事情的唯一方法。

    【讨论】:

      【解决方案3】:

      这听起来像是我使用 Hibernate 的项目中的问题。

      Hibernate 为您使用的每个域对象生成代理。这些代理保存在永久代空间下,并且在应用程序重新启动/重新部署时不会被清理。 PermGen 空间使用的内存量默认相对较小,因此您可以尝试使用 -XX:MaxPermSize java 参数来增加它。这可能会缩短您收到内存错误的时间,但我知道这个问题没有完整的解决方案。您最终将不得不自行重启 tomcat。

      首先对于 jdbc 问题,如果您手动使用连接,请确保它在 try catch finally 块中正确关闭。如果您不以这种方式使用连接对象,那么它可能会再次与 Hibernate 相关联。

      【讨论】:

      • 是的,我已将 maxpermsize 参数增加到 256mb。这有助于缩短重新启动之间的时间,但我希望有某种方法可以完全避免重新启动。还。对于 jdbc 问题,我将不得不对此进行调查。我对hibernate不是很熟悉,所以我不知道我是否必须自己这样做,或者它是否适合我?我以为hibernate会自动处理所有这些
      猜你喜欢
      • 2014-02-25
      • 1970-01-01
      • 2014-04-03
      • 2012-04-16
      • 2012-09-24
      • 2015-06-04
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多