严重:泄漏:ByteBuf.release() 在被垃圾收集之前未被调用。网络

SEVERE: LEAK: ByteBuf.release() was not called before it's garbage-collected. Netty

我创建了一些游戏服务器,我刚刚与大约 10 个伙伴进行了测试。一切都很顺利,我们玩了大约 10 分钟,在游戏的某个时刻,游戏服务器停止为客户端提供服务,所有人都断开连接,而且我连接到运行游戏的 VPS 的 SSH 也断开连接(我我不确定为什么)但在断开连接之前我总是收到此消息:

Sep 20, 2017 5:14:11 PM io.netty.util.ResourceLeakDetector reportUntracedLeak
SEVERE: LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak reporting to find out where the leak occurred. To enable advanced leak reporting, specify the JVM option '-Dio.netty.leakDetection.level=advanced' or call ResourceLeakDetector.setLevel() See http://netty.io/wiki/reference-counted-objects.html for more information.

我需要调试并了解此消息的真正含义,此错误的方向是什么。

我真的不知道我的代码的哪一部分需要弄清楚。

private void decodeData(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) {
    if (buffer.readableBytes() >= length) {
        ByteBuf data = buffer.readBytes(length);
        out.add(new Packet(opcode, data));
        setState(PacketDecodeState.OPCODE);
    }
}

在我读完数据后,我没有调用 buffer.release() 因为那样它不会真正处理任何数据包,只是一个错误的行为,我确信把它放在那里是错误的。

由于您的 Packet 持有对新创建的 ByteBuf 的引用,您需要确保调用此 ByteBufByteBuf.release() 否则会造成内存泄漏。