gpt4 book ai didi

java - 取消部署时 WebappClassLoader 和 Hibernate 内存泄漏?

转载 作者:行者123 更新时间:2023-11-28 23:36:02 24 4
gpt4 key购买 nike

编辑:关于此问题的 Hibernate 论坛主题:https://forum.hibernate.org/viewtopic.php?f=1&t=1035073

我正在使用 hibernate-4.3.1ehcache-core-2.6.7c3p0-0.9.5-pre5使用 Tomcat 7.0.27 并且在取消部署应用程序时我遇到了较大的 PermGen 泄漏。

我发现,WebappClassLoader 固定了很多类(here is 列表,如 JProfiler 所示。第一个数字是该类在内存中的对象数)

这是 ContextListener.contextDestroyed() 中的代码:

@Override
public void contextDestroyed(ServletContextEvent event) {
Debug.log.info("SERVER UNDEPLOY:");
serviceManager.destroyServices();
serviceManager = null; // this is static field :(

for (Object o : C3P0Registry.getPooledDataSources()) {
PooledDataSource dataSource = (PooledDataSource) o;
try {
Debug.log.info(String.format(
"-> deregistering C3P0 pool: size %s",
dataSource.getThreadPoolSize()));
dataSource.close();
Thread.sleep(500);
} catch (SQLException e) {
Debug.log.error(String.format(
" FAILED deregistering C3P0 pool: %s",
dataSource.getDataSourceName()), e);
} catch (InterruptedException e) {
}
}

Debug.log.info("-> shutting down cache manager");
CacheManager.getInstance().shutdown();

Enumeration<Driver> drivers = DriverManager.getDrivers();
while (drivers.hasMoreElements()) {
Driver driver = drivers.nextElement();
try {
Debug.log.info(String.format(
"-> deregistering jdbc driver: %s", driver));
DriverManager.deregisterDriver(driver);
} catch (SQLException e) {
Debug.log.error(String.format(
" FAILED deregistering driver %s", driver), e);
}
}

Debug.log.info("-> shutting down Hibernate factories");
Hibernate.factory.close(); //SessionFactory
Hibernate.factory = null; // static field :(

Debug.log.info("-> stopping logger");
Debug.log.info("............ SERVER stop ...................");
((LoggerContext) LoggerFactory.getILoggerFactory()).stop();

}

我尝试在分析器中分析对象的 GC 根,但没有成功。任何人都可以提出为什么会这样吗?

最佳答案

我很高兴你在 contextDestroyed(...) 中关闭()你的数据源!

但您可能还想尝试 c3p0 中的两个新设置,专门用于解决 Tomcat 和其他基于 ClassLoader 的热重新部署环境中的内存泄漏问题。请参阅green box here以及那里的链接。

(请升级到最新的 0.9.5-pre8。这些是新功能,我不记得是哪个 0.9.5 预发布版本引入的。)

关于java - 取消部署时 WebappClassLoader 和 Hibernate 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24516174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com