繁体   English   中英

Hibernate的Tomcat 6 Classloader泄漏

[英]Tomcat 6 Classloader leak for Hibernate

我有一个使用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方法调用后仍在转储中看到类对象? 怎么预防呢?

我建议深入研究堆转储,以了解哪些保留了对类加载器的引用。 我知道OpenJPA存在一个问题,即它无法自行清理。 我还没有听说过tomcat上的这个问题,但是肯定有可能。 对于傻笑,请尝试在关机时调用org.apache.openjpa.enhance.PCRegistry.deregister(ClassLoader)。

查看OPENJPA-2538了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM