我的应用程序有一个测试:
连接并发送多封格式的消息并关闭连接,重复这些步骤一天。
经过一天的测试后,我点击了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;
}
这是堆转储: