2017-09-20 4 views
0

私はいくつかのゲームサーバーを作成しました。すべてがスムーズになり、10分ぐらい遊んで、ゲームサーバーはクライアントのサービスを停止し、すべてのユーザーを切断しました。また、ゲームを実行するVPSに接続されたSSHも切断されました。 )が、切断される前に、私はいつもこのメッセージを得る:SEVERE:LEAK:ByteBuf.release()はガベージコレクションの前に呼び出されませんでした。 Netty

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として

答えて

2

が作成した新しいへの参照を保持しているByteBufあなたがそうでなければ、メモリリークを作成するには、このByteBufByteBuf.release()を呼び出すようにする必要があります。

関連する問題