Java Netty未正常关闭通道

Java Netty未正常关闭通道,java,netty,high-load,Java,Netty,High Load,我和内蒂是新朋友。现在正在迁移我的服务器,导致高负载。我读了很多人的书,做的每件事都像例子中那样,但有一个错误:CPU负载随着时间的推移而增长,而且速度非常快 通过分析堆和日志,我发现抛出异常(可能不仅仅是它们)的通道不能正常关闭,并保留在工作者的选择器中。我有150多个开放频道,有50个在线用户 我的代码如下 正在创建服务器: networkServer = new ServerBootstrap(new NioServerSocketChannelFactory(bossExec, ioEx

我和内蒂是新朋友。现在正在迁移我的服务器,导致高负载。我读了很多人的书,做的每件事都像例子中那样,但有一个错误:CPU负载随着时间的推移而增长,而且速度非常快

通过分析堆和日志,我发现抛出异常(可能不仅仅是它们)的通道不能正常关闭,并保留在工作者的选择器中。我有150多个开放频道,有50个在线用户

我的代码如下

正在创建服务器:

networkServer = new ServerBootstrap(new NioServerSocketChannelFactory(bossExec, ioExec, 4));
networkServer.setOption("backlog", 500);
networkServer.setOption("connectTimeoutMillis", 10000);
networkServer.setPipelineFactory(new ServerPipelineFactory());
Channel channel = networkServer.bind(new InetSocketAddress(address, port));
管道厂:

@Override
public ChannelPipeline getPipeline() throws Exception {
    PacketFrameDecoder decoder = new PacketFrameDecoder();
    PacketFrameEncoder encoder = new PacketFrameEncoder();
    return Channels.pipeline(decoder, encoder, new PlayerHandler(decoder, encoder));
}
解码器:

public class PacketFrameDecoder extends FrameDecoder {
@Override
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
}

@Override
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
}

@Override
protected Object decode(ChannelHandlerContext arg0, Channel arg1, ChannelBuffer buffer) throws Exception {
    try {
            buffer.markReaderIndex();
        Packet p = // ... doing decoding things
        if(p != null)
            return p;
                    // Reset buffer if not success
        buffer.resetReaderIndex();
            // Reset buffer if not success and got exception of not enough bytes in buffer
    } catch(BufferUnderflowException e) {
        buffer.resetReaderIndex();
    } catch(ArrayIndexOutOfBoundsException aioobe) {
        buffer.resetReaderIndex();
    }
    return null;
}
}
和处理程序:

@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    worker = new PlayerWorkerThread(this, e.getChannel());
}

@Override
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
    worker.disconnectedFromChannel();
}

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    if(e.getChannel().isOpen())
        worker.acceptPacket((Packet) e.getMessage());
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
    Server.logger.log(Level.WARNING, "Exception from downstream", e.getCause());
    ctx.getChannel().close();
}

除了不断增加的cpu负载外,一切都很好。

我想你得把事情缩小一点。我不明白你的意思。很抱歉我的英语不好…示例代码太长。请尽量提供编译和演示问题所需的最低数量。不可能提供编译的代码。这个例子将要长得多。我想你也不能模拟这个问题。我尽可能多地清理了。我在我的程序中发现了其他内存泄漏,witch将通道保留在堆中。问题结束了。我想你们得把范围缩小一点。我不明白你们的意思。很抱歉我的英语不好…示例代码太长。请尽量提供编译和演示问题所需的最低数量。不可能提供编译的代码。这个例子会更长。我想你也不能模拟这个问题。我尽可能多地清理了。我在我的程序中发现了其他内存泄漏,witch将通道保留在堆中。问题结束。