问题描述
我的团队一直在争论是否每次发布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个错误。我们哪个是正确的?
谢谢!
解决方法
每次泄漏仅记录一次...偏执仅表示它将对所有分配+所有操作进行采样。