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

时间:2017-09-20 16:01:57

标签: 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.

我需要调试并知道这条消息到底意味着什么,这个bug的方向是什么。

我真的不知道我的代码需要用什么来解决它。

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(),因为它不会真正处理任何数据包,只是一个错误的行为,我确定把它放在那里是错误的。

1 个答案:

答案 0 :(得分:2)

由于您的Packet包含对新创建的ByteBuf的引用,因此您需要确保调用此ByteBuf.release()的{​​{1}},否则会造成内存泄漏。