netty中用到内存泄露检测的地方主要有:1、CompositeByteBuf;2、HashedWheelTimer;3、继承AbstractByteBufAllocator的几个类。
下面我们看看netty里的内存检测类ResourceLeakDetector的具体实现:
netty的内存泄露检测分为四级:
DISABLED: 不进行内存泄露的检测;
SIMPLE: 抽样检测,且只对部分方法调用进行记录,消耗较小,有泄漏时可能会延迟报告,默认级别;
ADVANCED: 抽样检测,记录对象最近几次的调用记录,有泄漏时可能会延迟报告;
PARANOID: 每次创建一个对象时都进行泄露检测,且会记录对象最近的详细调用记录。是比较激进的内存泄露检测级别,消耗最大,建议只在测试时使用。
如果需要修改默认的检测级别,可以通过:1、调用静态方法setLevel进行修改;2、设置启动参数io.netty.leakDetectionLevel。
由于内存泄露主要是对某一类资源的检测,因此对于同一类的对象,只需实例化一个ResourceLeakDetector, 否则起不到检测的作用。
public class HashedWheelTimer implements Timer {
...
private static final ResourceLeakDetector<HashedWheelTimer> leakDetector =
new ResourceLeakDetector<HashedWheelTimer>(
HashedWheelTimer.class, 1, Runtime.getRuntime().availableProcessors() * 4);
...
初始化的时候需要设置被检测的类(或其他文字标记)、抽样间隔、最大活跃对象数