spring-boot - 将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) {
}
}
配置yaml文件:
spring:
redis:
host:
lettuce:
pool:
max-active: 100
有人帮忙吗?
解决方案
如果您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");
更多详情,请访问这里
推荐阅读
- regex - 使用正向 LookAhead 和 LookBehind 屏蔽数据库连接字符串中的密码
- java - 使用 if 找出三个数中最小的数
- java - 如何在 Drools 的决策表中使用命中策略
- node.js - 如何通过运行 npm install 解决 JSON 错误?
- reactjs - 如何忽略通过 HTTP 进行更改的客户端的 websocket 事件?
- python - 我需要在字典中保留某些键,并删除不必要的键
- dependencies - 组件“RICHTX32.OCX”或其依赖项之一未正确注册:文件丢失或无效
- html - 如何从静态隐私/法律/条件资产文档中访问全局 styles.scss?
- firebase - 是否可以查看有多少数据存在于 firebase 事件中?
- c# - 如何使用 Entity Framework Core 从数据图中分离实体?