严重:泄漏: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
的引用,您需要确保调用此 ByteBuf
的 ByteBuf.release()
否则会造成内存泄漏。
我创建了一些游戏服务器,我刚刚与大约 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
的引用,您需要确保调用此 ByteBuf
的 ByteBuf.release()
否则会造成内存泄漏。