使用Java的Redisson客户端时,踩了一些坑,分享再次,供大家参考。
因此引发的一次故障及排查过程参见: 记一次线上“内存泄露”故障
- RMapCache的坑
RMapCache的坑要从Redisson中Map结构的元素淘汰机制说起,详见 Redisson元素淘汰,为了能够实现对Map中每个元素单独设定 有效时间 和 最长闲置时间,Redisson会创建很多的EvictionTask【由Redisson的EvictionScheduler持有】来执行元素淘汰操作,这些Task实际是交给netty执行ScheduleTask【由netty的NioEventLoop持有】。
坑一:当大面积使用带有元素淘汰机制的Map类型时候(那些Map类型有元素淘汰功能,详见 Redisson元素淘汰),尤其是持续不断的大量新建时,在客户端会创建大量的Task,这些task会持有很多string类型的key。
○ EvictionTask持有的task,可以通过显式的调用Map上的destroy()方法释放,如果不显式释放,Redisson的EvictionScheduler持有了EvictionTask会导致内存泄露
○ 由于EvictionTask会交给netty进行Schedule,这些task会一直等到擦除任务执行完成后才会释放,这些key也不会释放【即使显示的调用destroy()也没用】。同时,netty的调度本身也会创建很多的task对象(FutureTask、ScheduleTask等),