本文已参与[新人创作礼]活动,一起开启掘金创作之路
Redis堆外内存溢出(OutOfDirectMemoryError)
当进行压力测试时后期后出现堆外内存溢出OutOfDirectMemoryError
新版本的Springboot的针对lettuce做了相关优化,在本人测试的时候使用lettuce未出现OutOfDirectMemoryError等BUG
产生原因
Redis自动配置
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
1,Springboot2.0以后默认使用lettuce作为操作redis的客户端,它使用netty进行网络通信 2,lettuce的bug导致netty堆外内存溢出,netty如果没有指定堆外内存,默认使用虚拟机的-Xms的值,可以使用-Dio.netty.maxDirectMemory进行设置
解决方案
由于是lettuce的bug造成,不能直接使用-Dio.netty.maxDirectMemory去调大虚拟机堆外内存,时间久了堆外内存溢出问题肯定还会出现,治标不治本。 ==解决方案==:切换使用Jedis,先排除lettuce的核心包,使用jedis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
堆外内存溢出OutOfDirectMemoryError,完美解决