当netty的io.netty.channel.nio.SelectedSelectionKeySet持有太多selectionkeyimpl不能被gced?

时间:2016-01-07 01:10:24

标签: netty nio

我的应用程序有一个测试:

连接并发送多封格式的消息并关闭连接,重复这些步骤一天。

经过一天的测试后,我点击了GC,我发现SelectedSelectionKeySet仍然保留了太多的selectionkeyimpl(超过149645个项目)?

当我遇到这种情况时,我不会感到失望:

项0-537为null而不是selectionkeyimpl,因此不能使用后一部分。

在我的案例中约537之后的项目之后是selectionkeyimpl。

我的特殊解码是:所以格式化的每条消息都会调用“return null”;

public class FrameDecoder extends DelimiterBasedFrameDecoder {

    private static final Logger LOG = Logger.getLogger(FrameDecoder .class);

    private static final int FRAME_MAX_LENGTH = 10*1024*1024;

    public DsAgentFrameDecoder() {
        super(FRAME_MAX_LENGTH, Unpooled.wrappedBuffer(CodecConstants.FRAME_TAILER.getBytes()));
    }

    @Override
    protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception {
        ByteBuf byteBuf = (ByteBuf) super.decode(ctx, buffer);

        try{

            if (byteBuf == null) {
                if(LOG.isDebugEnabled())
                    LOG.debug("[tcp][receive]bytebuf is null");
                return null;
            }

这是堆转储:

there are too many objects and the first 0-537's element is null instead of selectionkeyimpl so that the latter part can't be consumed.

enter image description here enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

这是netty的错误,我已修复它:https://github.com/netty/netty/pull/4673