【问题标题】:Tomcat 6 Classloader leak for Hibernate用于休眠的 Tomcat 6 类加载器泄漏
【发布时间】:2015-02-10 09:43:07
【问题描述】:

我有一个使用 Hibernate + OpenJPA 进行数据库连接的 Web 应用程序。当使用 tomcat 管理器取消部署此应用程序时,然后当我们进行内存转储并检查转储中的类对象时,我在转储中看到许多 Hibernate、Log4j 和 servlet 类对象。即使当我为每个人调用正确的关机时。这是我用来关闭它们的代码。它在 contextDestroyed(ServletContextEvent sce) 中调用

EntityManager em = EntityManagerHelper.getEntityManager();
/* Get a session.*/
Session session = (Session) em.getDelegate();
System.out.println("Calling session close.");
closeSessionFactory(session.getSessionFactory());

System.out.println("Closing EntityMnanager.");
EntityManagerHelper.closeEntityManagerFactory();

System.out.println("De-registering the JDBC drivers.");
deregisterJDBCDrivers();

System.out.println("Shutting down log4j.");
org.apache.log4j.LogManager.shutdown();

为什么我在调用 shutdown/close 方法调用后仍然在转储中看到类对象?如何预防?

【问题讨论】:

  • 可能是因为它们还没有被垃圾回收?但是您还使用了旧版本的 Tomcat,您可能需要对更新的版本进行一些测试,看看是否有任何改变。
  • 你试过this解决方案吗?

标签: java hibernate tomcat log4j openjpa


【解决方案1】:

我会建议通过堆转储来查看保留对类加载器的引用的内容。我知道 OpenJPA 存在无法自行清理的问题。在tomcat上没听说过这个问题,但肯定是有可能的。对于傻笑,请尝试在关机时调用 org.apache.openjpa.enhance.PCRegistry.deregister(ClassLoader)。

查看OPENJPA-2538了解详情。

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 2015-12-21
    • 2015-03-11
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多