1、采用Redis集群,避免单机出现问题。
2、限流,避免同时处理大量的请求。
3、热点缓存失效,可以设置不同的失效时间。
测试环境一个新的服务每一周左右就发触发内存溢出问题。
核心报错信息如下:
新版本修改了org.redisson.client.handler.PingConnectionHandler这个类
旧版会导致:org.redisson.client.handler.CommandsQueue 类里边的Queue<QueueCommandHolder>queue 内存溢出,Queue<QueueCommandHolder>queue这里边放的全是PING
新版本核心变更PingConnectionHandler :
这个在redis执行的命令实际上是 BLPOP 这个质量的官方解释是
take实际转成底层TCP命令就是无限等,但这个情况只是阻塞当前的连接,对于并发的连接不会有阻塞发生,oom出问题也就是当前几个消费的连接无限new导致的,因为对于jvm是两个独立线程 但是对于redis是同一个client或者同一个connection.
1)、springboot2.以后默认使用Lettuce作为 *** 作redis的客户端。它使用netty进行网络通信。2)、Lettuce的bug导致netty堆外内存溢出-Xmx300m;netty如果没有指定堆外内存,默认使用-Xmx300m
可以通过-Dio.netty.maxDirectMemory进行设置
不能使用-Dio.netty.maxDirectMemory只去调大堆外内存。
1)、升级Lettuce客户端。2)、切换使用jedis
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)