为什么我得到 netty.util.ResourceLeakDetector 尽管我在 finally 块中释放了缓冲区?
why I get netty.util.ResourceLeakDetector although I release the buffer in finally block?
这是我的代码的要点
public static void doSomething(ByteBuf buf) {
ByteBuf bufCopy;
try {
bufCopy = buf.copy();
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)) {
//do something
} catch (IOException ex) {
throw new IllegalArgumentException("something went wrong", ex);
}
}
finally {
buf.release();
}
}
我在日志中收到以下消息
io.netty.util.ResourceLeakDetector : LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records:
Created at:
io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:331)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:185)
io.netty.buffer.UnsafeByteBufUtil.copy(UnsafeByteBufUtil.java:436)
io.netty.buffer.PooledUnsafeDirectByteBuf.copy(PooledUnsafeDirectByteBuf.java:309)
io.netty.buffer.AbstractByteBuf.copy(AbstractByteBuf.java:1194)
这里有什么问题以及如何解决这个问题?
顺便说一句,这 NOT 始终无法重现。当我重新启动服务器时,错误消失了,但是一旦服务器启动并且 运行 几分钟,我就开始看到这个警告。
因为您也错过了发布 bufCopy
。这清楚地显示在日志中。
这是我的代码的要点
public static void doSomething(ByteBuf buf) {
ByteBuf bufCopy;
try {
bufCopy = buf.copy();
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)) {
//do something
} catch (IOException ex) {
throw new IllegalArgumentException("something went wrong", ex);
}
}
finally {
buf.release();
}
}
我在日志中收到以下消息
io.netty.util.ResourceLeakDetector : LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records:
Created at:
io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:331)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:185)
io.netty.buffer.UnsafeByteBufUtil.copy(UnsafeByteBufUtil.java:436)
io.netty.buffer.PooledUnsafeDirectByteBuf.copy(PooledUnsafeDirectByteBuf.java:309)
io.netty.buffer.AbstractByteBuf.copy(AbstractByteBuf.java:1194)
这里有什么问题以及如何解决这个问题?
顺便说一句,这 NOT 始终无法重现。当我重新启动服务器时,错误消失了,但是一旦服务器启动并且 运行 几分钟,我就开始看到这个警告。
因为您也错过了发布 bufCopy
。这清楚地显示在日志中。