欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实战ERROR:OutOfDirectMemoryError 产生环境-堆外内存溢出

程序员文章站 2022-07-15 14:39:53
...

Lettuce & Jedis

redisTemplate (StringRedisTemplate类)

Lettuce & Jedis 操作redis的底层客户端,Spring再次封装 redisTemplate
实战ERROR:OutOfDirectMemoryError 产生环境-堆外内存溢出
无论我们使用哪个服务,最后都可以获得连接工厂

实战ERROR:OutOfDirectMemoryError 产生环境-堆外内存溢出

堆外内存溢出

原因:

  • springboot2.0 以后默认使用 Lettuce 作为操作redis的客户端
    它使用netty进行网络通信

  • Lettuce 的bug导致netty堆外内存溢出

  • 设置JVM:-Xmx300m

  • netty如果没有指定堆外内存,默认使用 -Xmx300m

解决方案

  • 不能使用 -Dio.netty.maxDirectMemory只去调大堆外内存
  • 方式一:升级 Lettuce 客户端
  • 方拾二:切换使用 jedis
<!--   引入 redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    
    <!-- 排除 lettuce -->
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!--  引入 jedis-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>