You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:47:04