springboot 整合 redis 报 io.netty.util.internal.OutOfDirectMemoryError

博客围绕Spring Boot 2.0整合Redis时出现的报错展开。报错原因是lettuce的bug导致netty堆外内存溢出,并发获取数据时大量数据占满堆外内存且未及时释放。解决方案有两个,一是升级lettuce客户端,需等Spring官方解决bug;二是切换使用jedis操作Redis。

报错页面:

 

在这里插入图片描述

报错场景:

在使用jmeter进行压测 从redis 获取 商品分类结果,使用的是 spring boot 整合的 redis启动器,会报以上错误。
(只有在压力并发测试的时候,才能测试错以为报错)
  • 1
  • 2

报错原因:

  1. springboot2.0 整合redis 默认使用的是 lettuce 操作的reids ,lettuce底层使用的netty进行网络通信

在这里插入图片描述

  1. lettuce 的bug 导致netty堆外内存溢出,

  2. netty如果没有指定堆外内存,那么netty默认分配的堆外内存就会使用jvm 的 --Xmx 指定的内存,

  3. 当我们并发获取的数据的时候,大量的数据就会占满netty more的堆外内存,

  4. lettuce 操作netty的时候,没有及时的进行内存释放,导致以上报错

解决方案:

不能使用 -Dio.netty.MaxDirectMemory 只去调整堆外内存,调大内存只会延缓出现异常的时候,但是最终还是会出现异常

方案1:
升级lettuce 客户端,

方案1要等spring官方 有没有解决此bug

方案2:
切换使用 jedis 操作redis

在pom 文件中引入redis依赖的时候,排除lettuce, 然后再引入 jedis
在这里插入图片描述

[middleplatform-cloudstorage] [] [] [] 2025-10-29 11:19:45,270 [redisson-netty-8-5] ERROR org.redisson.connection.DNSMonitor:102 - Unable to resolve master.mp-prod-fk.lq1ohq.euc1.cache.amazonaws.com io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Failed to resolve 'master.mp-prod-fk.lq1ohq.euc1.cache.amazonaws.com' [A(1)] and search domain query for configured domains failed as well: [eu-central-1.compute.internal] at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1150) at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:1097) at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:455) at io.netty.resolver.dns.DnsResolveContext.access$700(DnsResolveContext.java:70) at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:524) at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590) at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:583) at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:559) at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492) at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636) at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:629) at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:118) at io.netty.resolver.dns.DnsQueryContext.finishFailure(DnsQueryContext.java:343) at io.netty.resolver.dns.DnsQueryContext$4.run(DnsQueryContext.java:278) at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:156) at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
最新发布
10-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Thomas.Sir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值