У меня есть некоторые сомнения в отношении подсчета байтов в Netty 5 (или 4). Я обнаружил, что ничего не происходит, когда я не выпускаю bytebuf, когда он выходит из жизненного цикла, кажется, что память, используемая bytebuf, может быть GCed должным образом.Netty 4/5 фактически не обнаруживает утечку ресурсов bytebuf?
В этой ссылке http://netty.io/wiki/reference-counted-objects.html говорится, что установка опции JVM «-Dio.netty.leakDetectionLevel = advanced» или вызов ResourceLeakDetector.setLevel() может обнаруживать утечку ресурсов, но я не могу воспроизвести ее с помощью кода ниже.
public class App {
public static ByteBuf a(ByteBuf input) {
input.writeByte(42);
return input;
}
public static ByteBuf b(ByteBuf input) {
try {
ByteBuf output;
output = input.alloc().directBuffer(input.readableBytes() + 1);
output.writeBytes(input);
output.writeByte(42);
return output;
} finally {
// input.release();
}
}
public static void c(ByteBuf input) {
//System.out.println(input);
// input.release();
}
static class Task implements Runnable {
ByteBuf bbBuf;
public Task(ByteBuf buf) {
bbBuf = buf;
}
public void run() {
c(b(a(bbBuf)));
}
}
public static void main(String[] args) {
ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID);
AbstractByteBufAllocator allocator = new PooledByteBufAllocator();
ByteBuf buf = allocator.buffer(10, 100);
// buf.release();
new Thread(new Task(buf)).start();
System.out.println(buf.refCnt());
assert buf.refCnt() == 0;
}
}
Так в чем проблема?
Благодарим вас за ответ. Я сомневаюсь, что могу ли я просто не выпускать bytebuf и полагаться только на gc для сбора памяти? Если я сделаю так, объединенный bytebuf просто потерял бы свое преимущество, и это не повлияет на неохлаждаемый bytebuf. –