Утечка памяти Ошибка при подключении редис с салатом-клиентом - PullRequest
0 голосов
/ 17 декабря 2018

Я использую салат для подключения к 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 file:

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

Кто-нибудь помогает?

Ответы [ 2 ]

0 голосов
/ 03 апреля 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");

Для получения дополнительной информации, пожалуйста, посетите ЗДЕСЬ

0 голосов
/ 17 декабря 2018

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

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

...