![](/img/trans.png)
[英]Server Stop responding because of [Pool-Cleaner]:Tomcat Connection Pool but has failed to stop it. This is very likely to create a memory leak
[英]When shut down tomcat i met [commons-pool-EvictionTimer] but has failed to stop it
服務器版本:Apache Tomcat/8.0.26
服務器建成時間:2015 年 8 月 18 日 11:38:37 UTC
服務器編號:8.0.26.0
操作系統名稱:Linux
操作系統版本:2.6.32-642.3.1.el6.x86_64
架構:amd64
JVM 版本:1.8.0_60-b27
JVM 供應商:甲骨文公司
我正在使用 jedis 版本:2.8.2(commons-pool2:2.4.2) 當我關閉 tomcat 時,有一些警告消息。
13-Feb-2017 08:12:14.006 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [commons-pool-EvictionTimer] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.util.TimerThread.mainLoop(Timer.java:552)
java.util.TimerThread.run(Timer.java:505)
這是絕地武士的一些conf。
...
@Bean(name = "jedisConnectionFactory", destroyMethod = "destroy")
public JedisConnectionFactory jedisConnectionFactory() throws IOException {
final Properties redisConfig = PropertiesLoaderUtils.loadProperties(
new PathMatchingResourcePatternResolver().getResource("classpath:redis.properties"));
final JedisConnectionFactory result = new JedisConnectionFactory();
result.setHostName(redisConfig.getProperty("redis.hostName"));
result.setPort(Integer.parseInt(redisConfig.getProperty("redis.port")));
result.setUsePool(Boolean.parseBoolean(redisConfig.getProperty("redis.pool.use")));
result.setTimeout(Integer.parseInt(redisConfig.getProperty("redis.timeout")));
result.setPoolConfig(createJedisPoolConfig(redisConfig));
result.afterPropertiesSet();
return result;
}
...
我怎樣才能解決這個問題?
看起來像一個已知問題,請參閱https://github.com/xetorthio/jedis/issues/936 。
顯然,您不需要清理JedisConnectionFactory
本身,而是需要在工廠的幫助下創建的連接池。
問題是JedisConnectionFactory.afterPropertiesSet()
被調用兩次,一次在您的代碼中( result.afterPropsertiesSet()
),一次由 Spring 調用。 JedisConnectionFactory.afterPropsertiesSet()
創建 Jedis 連接池,它為每次調用將驅逐計時器任務添加到 ScheduledThreadPoolExecutor。 JedisConnectionFactory 只保留最近創建的池,所以在清理時,只有最后一個驅逐計時器任務被取消,而其他則沒有。 這可以防止 ScheduledThreadPoolExecutor 的線程關閉。
如果您刪除對result.afterPropertiesSet()
調用,那么只會創建一個帶有一個驅逐任務的池,並且一旦 Spring 銷毀 JedisConnectionFactory,該線程將關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.