netty内存泄漏是什么
- 原因:忘记release
调用ByteBuf buffer=ctx.alloc().buffer(); - 导致:堆外内存未free和堆内池化内存未归还,占用的资源未释放,导致OOM。
netty内存检测方法:
- 1.引用计数(buffer.reCnt()), ByteBuf buffer=ctx.alloc().buffer(),引用计数+1,buffer.release() 引用计数-1,等于0时自动释放
- 2.弱引用 创建ByteBuf时,定义弱引用对象,并加到list中,当引用计数为0时,自动执行释放资源操作,并将弱引用对象从list里面移除
- 判断:弱引用在list中,那么buffer计数不为0,也就是没有释放,弱引用被回收,可以把弱引用放到ReferenceQueue中,遍历这个队里,就可以知道哪些被回收了
netty内存泄漏检测工具
- 方法 -Dio.netty.leakDetection.level=PARANOID
- 注意 1.模式检测级别为SIMPLE,不是每次都检测 2.GC后才有可能检测到 3.上线前用最高级别,上线后用默认级别
netty 注解
- @Sharable:标识一个Handler提醒是否可以共享,没有这个的话,不能重复加入pipeLine
- @Skip:标识是否跳过该hand