实战ERROR:OutOfDirectMemoryError 产生环境-堆外内存溢出
程序员文章站
2022-07-15 14:39:53
...
Lettuce & Jedis
redisTemplate (StringRedisTemplate类)
Lettuce & Jedis 操作redis的底层客户端,Spring再次封装 redisTemplate
无论我们使用哪个服务,最后都可以获得连接工厂
堆外内存溢出
原因:
-
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>