Redis堆外内存溢出(OutOfDirectMemoryError)

当进行压力测试时后期后出现堆外内存溢出OutOfDirectMemoryError

新版本的Springboot的针对lettuce做了相关优化,在本人测试的时候使用lettuce未出现OutOfDirectMemoryError等BUG

产生原因

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐