Ошибка утечки памяти при подключении Redis к клиенту салата

Я использую салат для подключения к redis: spring-boot-starter-redis: 2.0.6.RELEASE, когда я запускаю приложение, появляется эта ошибка:

[ERROR][main][ResourceLeakDetector][error] - LEAK: 
HashedWheelTimer.release() was not called before it's garbage- 
collected. See http://netty.io/wiki/reference-counted-objects.html for 
more information.
Recent access records: 
Created at:
io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:272)
io.netty.util.HashedWheelTimer.<init>(HashedWheelTimer.java:216)
io.lettuce.core.resource.DefaultClientResources.<init>(DefaultClientResources.java:163)
io.lettuce.core.resource.DefaultClientResources$Builder.build(DefaultClientResources.java:461)
io.lettuce.core.resource.DefaultClientResources.create(DefaultClientResources.java:229)
io.lettuce.core.AbstractRedisClient.<init>(AbstractRedisClient.java:96)
io.lettuce.core.RedisClient.<init>(RedisClient.java:86)
io.lettuce.core.RedisClient.create(RedisClient.java:123)
org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.lambda$createClient$7(LettuceConnectionFactory.java:853)
java.util.Optional.orElseGet(Optional.java:267)
org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.createClient(LettuceConnectionFactory.java:853)
org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory.afterPropertiesSet(LettuceConnectionFactory.java:232)

файл конфигурации redis:

  public class RedisConfig {

  @Bean
  RedisConnectionFactory lettuceConnectionFactory(RedisProperties 
   redisProperties) {
   // 
  }

  @Bean
  public RedisTemplate<String, Object> 
  redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {

  }

  private RedisStandaloneConfiguration connection(RedisProperties 
  redisProperties) {

  }
 }

config yaml файл:

  spring:      
   redis:
     host: 
     lettuce:
      pool:
       max-active:  100

кто-нибудь поможет?


person rellocs wood    schedule 17.12.2018    source источник


Ответы (2)


Этот тип ошибки обычно возникает, когда создается несколько экземпляров RedisClient без совместного использования ClientResources.

Spring Boot создает одноэлементный экземпляр, поэтому любые другие экземпляры могут быть созданы либо вашим кодом, либо внешними зависимостями. Без дальнейшего контекста сказать больше невозможно.

person mp911de    schedule 17.12.2018
comment
Привет @ mp911de, я обновил сообщение своими файлами конфигурации, пожалуйста, посмотрите - person rellocs wood; 18.12.2018
comment
Если вы создаете такой bean-компонент из своего кода, я бы посоветовал вам создать bean-компонент ClientResources до запуска LettuceConnectionConfiguration и добавить его в контекст Spring и использовать его для своего варианта использования, или вы можете сделать другой способ, просто автоматически подключив bean-компонент, созданный с помощью auto config и использовать его для созданных вами beans. - person omjego; 22.05.2019

Если вы используете много RedisClient экземпляров в своем приложении - вам необходимо разделить между ними ClientResources объект.

Типичный способ создания RedisClient:

    RedisClient.create("someUrl");

Но этот способ создания объекта не рекомендуется, если вы хотите создать несколько экземпляров. Внутри RedisClient есть поле с тяжелым объектом: ClientResources Когда вы создаете много экземпляров RedisClient, во время выполнения может возникать ошибка.

LEAK: You are creating too many HashedWheelTimer instances.  HashedWheelTimer is a shared resource that must be reused across the JVM,so that only a few instances are created.

Что вы можете сделать, так это создать один общий ClientResources в своем приложении. И передайте этот объект конструктору RedisClient.

Например:

    ClientResources sharedResources = DefaultClientResources.create();

    //and use this between many RedisClients i.e.:

    RedisClient first = RedisClient.create(sharedResources, "someUrl");
    RedisClient second = RedisClient.create(sharedResources, "someUrl_222");
    RedisClient third = RedisClient.create(sharedResources, "someUrl_3333");

Для получения дополнительных сведений посетите ЗДЕСЬ

person Schakal    schedule 03.04.2019
comment
Это вступает в силу, здорово! - person jay chang; 04.02.2021