【问题标题】:Memory leak in web-app, tomcat+hibernate+GuiceWeb应用程序中的内存泄漏,tomcat + hibernate + Guice
【发布时间】:2014-04-05 18:36:23
【问题描述】:

在多次重新部署后,应用程序因 PermGen 错误而崩溃。我知道增加 permgen 大小的解决方法。但我试图揭示泄漏的原因。重新部署后,我使用 jvisualvm 进行了堆转储并搜索 WebAppClassLoader 的实例。正如预期的那样,有一个不是 GC-ed。显示到 platformMBeanServer(MangementFactory 类型)最近的 GC 根点。所以问题是我能用它做什么?

还有一些额外的信息。我的 jdbc 驱动程序 jar 位于 tomcat 的 lib 目录和 bin 目录中的 .dll 文件中。当我评论 hibernate sessionFactory 创建时 - 问题消失了。会话工厂在 servlet 过滤器的 init 方法中创建,并在 destroy 方法中关闭。 Hibernate 使用 c3p0 连接池。

【问题讨论】:

标签: java hibernate jakarta-ee tomcat jvisualvm


【解决方案1】:

您可以尝试添加这些 Java 选项:

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

这会在 PermGen 空间中启用垃圾收集(默认关闭)并允许 GC 卸载类。

【讨论】:

  • 感谢您的建议,但没有任何改变。 GC 无法收集它,因为存在对旧 WebAppClassLoader 的引用
  • PermGen-cleansing 总是启用的,否则不会卸载任何类。他们卸载就好了,没有添加任何选项。
【解决方案2】:

我找到了解决方案。结果发现连接池 c3p0 0.9.2.1 存在内存泄漏。并且休眠 4.3.1-Final 使用该版本的 c3p0。切换到休眠 4.1.12 和 c3p0 0.9.1 解决了我的问题。

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 2012-05-05
    • 2012-02-09
    • 2014-04-03
    • 2012-04-02
    • 2014-04-12
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多