在重新部署时释放Hibernate资源

时间:2012-12-24 00:28:35

标签: 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线程问题。我还能够发现并修复因使用Velocity作为Web应用程序中的单例而导致的问题,并且还没有在正确的时间/地点关闭我正在使用的一些线程局部变量。但我仍然无法消除/弄清楚这个Hibernate问题。

以下是我正在做的事情:

  1. 从我的开发IDE部署我的webapp
  2. 在浏览器中打开tomcat管理器窗口
  3. 启动VisualVM并在tomcat实例上获取HeapDump
  4. 转到tomcat管理器并重新部署我的webapp
  5. 在VisualVM中获取另一个HeapDump
  6. 我的第一个观察是原始webapp的WebappClassLoader没有被垃圾收集。

    当我仔细检查来自第二个HeapDump的保留对象时,类org.hibernate.internal.SessionFactoryImpl的显着特征使我相信它不会被Spring销毁/关闭或沿着这些行(因此WebappClassLoader)仍然提到它。)

    是否有人遇到此问题并确定了正确的解决方法?

1 个答案:

答案 0 :(得分:1)

我目前不知道您的设置可能有什么不妥,但我知道使用Plumbr您很可能会发现实际泄漏。