Redis堆外内存溢出(OutOfDirectMemoryError)

520 阅读1分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

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,完美解决