Netty的ResourceLeakDetector +偏执模式-是否记录“每次”泄漏?

问题描述

我的团队一直在争论是否每次发布ByteBuf失败都会总是记录日志。可以理解,大多数人认为您会的。我一直是最大的怀疑者。我的困惑最终归因于this line of code,它似乎仅在由堆栈跟踪信息组成的字符串唯一的情况下记录泄漏。

我编写了OOM编写的这段代码,但只产生了两个“泄漏”错误消息(每个线程一个)。

public static void main(String[] args) throws Exception {
    ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.ParaNOID);
    final int len = 10_000_000;

    final PooledByteBufAllocator bufAllocator = new PooledByteBufAllocator();

    final Thread t1 = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i < len; i++) {
                bufAllocator.buffer(512);
            }
        }
    };

    final Thread t2 = new Thread() {
        @Override
        public void run() {
            for (int i = 0; i < len; i++) {
                bufAllocator.buffer(512);
            }
        }
    };

    t1.start();
    t2.start();
    t1.join();
    t2.join();
} 

运行此命令时,我将-Xmx设置得足够低,这样我在日志中会收到2条错误消息。

所以。.上面的代码中只有一个“泄漏”吗?如果以偏执狂模式在检漏仪中运行,那么每次ByteBuf的泄漏我们都会收到一条记录的错误消息吗?

更新的问题: 我和我的团队对正在发生的事情有不同意见。我担心的是,我们有2条代码路径“泄漏”资源,但实际上发生了2000万次“泄漏”。他们认为仅发生2次“泄漏”,因为我们在日志中仅看到2个错误。我们哪个是正确的?

谢谢!

解决方法

每次泄漏仅记录一次...偏执仅表示它将对所有分配+所有操作进行采样。