为什么我得到 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。这清楚地显示在日志中。