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 个错误。我们谁是正确的?
谢谢!
每次泄漏只会记录一次...偏执只是意味着它将对所有分配+所有操作进行采样。
我的团队一直在争论你是否会总是 每次发布 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 个错误。我们谁是正确的?
谢谢!
每次泄漏只会记录一次...偏执只是意味着它将对所有分配+所有操作进行采样。