Spring 在重新部署时释放Hibernate资源

Spring 在重新部署时释放Hibernate资源,spring,hibernate,jpa,out-of-memory,Spring,Hibernate,Jpa,Out Of Memory,我有一个运行在Tomcat 6.0.35上的web应用程序,它使用Spring 3.1.2、Hibernate 4.1.8和MySQL Connector 5.1.21 我一直在试图找出是什么原因导致Tomcat在重新部署几次后继续内存不足(Perm-Gen) 注意:不要告诉我增加Tomcat的JVM内存,因为这只会推迟问题的解决 具体来说,我使用了VisualVM工具,并且能够消除一些问题,包括一些mysql和google线程问题。我还能够发现并修复由于在web应用程序中将Velocity用作

我有一个运行在Tomcat 6.0.35上的web应用程序,它使用Spring 3.1.2、Hibernate 4.1.8和MySQL Connector 5.1.21

我一直在试图找出是什么原因导致Tomcat在重新部署几次后继续内存不足(Perm-Gen)

注意:不要告诉我增加Tomcat的JVM内存,因为这只会推迟问题的解决

具体来说,我使用了VisualVM工具,并且能够消除一些问题,包括一些mysql和google线程问题。我还能够发现并修复由于在web应用程序中将Velocity用作单例而导致的问题,并且没有在正确的时间/位置关闭我使用的一些线程局部变量。但是我仍然不能完全消除/解决这个休眠问题

以下是我正在做的:

  • 从我的开发IDE部署我的webapp
  • 在我的浏览器中打开tomcat管理器窗口
  • 启动VisualVM并获取tomcat实例上的HeapDump
  • 转到tomcat管理器并重新部署我的webapp
  • 在VisualVM中进行另一次HeapDump
  • 我的第一个观察是,原始webapp的WebappClassLoader没有被垃圾收集

    当我仔细检查第二个HeapDump中保留的对象时,org.hibernate.internal.sessionfactorympl类的显著特性使我相信它并没有被Spring或类似的东西破坏/关闭(因此WebappClassLoader仍然引用它)


    是否有人遇到过此问题并找到了正确的解决方案?

    我目前不知道您的设置中可能存在什么问题,但我知道,使用它您很可能会发现实际的泄漏。

    您的IDE和操作系统环境是什么?感谢您将我指向Plumber。这是一个很棒且易于使用的工具,但它只提供了我从VisualVM获得的信息。但真正让我找到根本原因的工具是Eclipse内存分析器。更重要的是,问题是由java.util.logging.Level引起的。当我从EclipseMat得到这个提示时,我四处寻找并发现了这个博客:。根据我在这里收集的信息,我将日志切换为使用logback,瞧!内存泄漏停止了。伟大的此博客上的信息显示了如何使用Eclipse MAT:。这个网站提供了一些关于内存泄漏的好背景:水管工应该准确地告诉你哪个类正在泄漏,通常是这样。你是说这个虫子?与直接使用日志框架(JUL、log4j、logback等)不同,我将针对实际的日志后端进行编程和配置,从而将slf4j连接到X!!!这正是问题所在。当我重新部署时,它导致tomcat的类加载器挂起整个对象图。我花了一个多星期才弄清真相。是的,我现在根据slf4j api和logback编程,进行实际的日志记录。谢谢你给我看那个bug报告