问题描述:
springboot 2.0,整合redis实现缓存,当并发请求上来达到一定量级,会导致系统爆发该异常。
产生原因:
1.springboot 2.0以后默认使用lettuce作为操作redis的客户端,lettuce使用netty进行网络通讯;
2.lettuce设计的bug导致netty堆外内存溢出,netty如果没有指定堆外内存,默认采用jvm配置的。
解决思路:
1.调大-Xmx大小:弊端:调大Xmx只会延缓异常爆发的时间,不能从根本上解决该问题;
2.通过设置netty最大直接堆内存大小-Dio.netty.maxDirectMemory,弊端:这个实现起来比较难,需要修改底层代码,也只会推迟爆发的时间而已;
3.升级lettuce客户端;
4.将spring-boot-starter-data-redis依赖中的lettuce剔除,并引入jedis依赖,将redis客户端切换为jedis。