Spring Boot启动时HikariPool-1 housekeeper线程未停止问题求助
解决Spring Boot中HikariPool-1 housekeeper线程未停止引发的内存泄漏问题
问题现象
启动Spring Boot应用时出现如下警告日志:
o.a.c.loader.WebappClassLoaderBase.log : The web application [ROOT] appears to have started a thread named [HikariPool-1 housekeeper] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
该线程未正常终止,极易引发内存泄漏。
解决方案
确保Spring Boot与HikariCP版本兼容
检查项目中HikariCP版本是否与当前Spring Boot版本匹配,部分旧版本HikariCP存在容器关闭时线程未正确销毁的bug。建议通过Spring Boot依赖管理统一控制版本,避免版本冲突。手动关闭Hikari数据源
在应用关闭生命周期中手动销毁数据源,确保线程被正确终止。可通过实现DisposableBean接口或使用@PreDestroy注解:@Component public class DataSourceShutdownHook implements DisposableBean { @Autowired private DataSource dataSource; @Override public void destroy() throws Exception { if (dataSource instanceof HikariDataSource) { ((HikariDataSource) dataSource).close(); } } }调整HikariCP超时配置
添加shutdown-timeout参数,为线程销毁设置合理超时时间,保证容器关闭时有足够时间终止housekeeper线程。在application.properties中配置:spring.datasource.hikari.shutdown-timeout=3000单位为毫秒,可根据实际情况调整数值。
排查未被Spring管理的数据源实例
检查项目中是否存在手动创建的HikariDataSource实例,这类实例未交由Spring容器管理,应用关闭时不会自动销毁,需手动调用close()方法终止。配置内嵌Tomcat线程清理策略(若使用内嵌Tomcat)
针对Spring Boot内嵌Tomcat,可开启线程清理选项,确保Web应用停止时回收所有线程:@Bean public TomcatServletWebServerFactory tomcatFactory() { return new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { context.setClearReferencesStopThreads(true); } }; }
内容的提问来源于stack exchange,提问作者user17128742
相关产品推荐
相关产品推荐

