Netty 的 ResourceLeakDetector + 偏执模式 - 它是否记录 'every' 泄漏?

Netty's ResourceLeakDetector + paranoid mode - Does it log 'every' leak?

我的团队一直在争论你是否会总是 每次发布 ByteBuf 失败时都会收到一条记录消息。可以理解的是,大多数人认为你会。我一直是最大的怀疑者。我的困惑最终源于 this line of code,如果由堆栈跟踪信息组成的字符串是唯一的,它似乎只记录泄漏。

我写了这段 OOM 的代码,但只产生了两条 'LEAK' 错误消息(每个线程一条)。

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 条错误消息。

So.. 上面的代码中只有一个'leak'吗?如果 运行 在偏执模式下使用泄漏检测器,我们是否会在每次 ByteBuf 泄漏时收到记录的错误消息?

更新问题: 我和我的团队对正在发生的事情存在分歧。我担心的是我们有 2 个 'leak' 资源的代码路径,但实际发生了 20M 'leaks'。他们认为只有 2 'leaks' 发生,因为我们在日志中只看到 2 个错误。我们谁是正确的?

谢谢!

每次泄漏只会记录一次...偏执只是意味着它将对所有分配+所有操作进行采样。