当以高速率提供数据时,udp服务器会抛出OOM异常

时间:2013-05-22 08:51:25

标签: java out-of-memory netty

为了获得最大64kb的数据并减少数据包丢失,我使用netty 4.0配置如下的udp服务器

public class UdpServer {

    public void run()
        throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap b = new Bootstrap();
            b.group( group ).channel( NioDatagramChannel.class ).option( ChannelOption.SO_BROADCAST, true )
                .option( ChannelOption.UDP_RECEIVE_PACKET_SIZE, 1024 * 64 )
                .option( ChannelOption.SO_RCVBUF, 1024 * 1024 * 100 ).handler( new UserHandler() );

            b.bind( 5141 ).sync().channel().closeFuture().await();
        }
        finally {
            group.shutdownGracefully();
        }
    }

    public static void main( String[] args )
        throws Exception {
        new UdpServer().run();
    }
}

当我以20kmsg / s的速度向udp sercer提供数据时,它会抛出OOM异常。 我发现原因是UDP_RECEIVE_PACKET_SIZE的配置参数太大,以至于直接缓冲区内存很快耗尽。如果我将1024 * 128设置为SO_RCVBUF,1024 * 2设置为UDP_RECEIVE_PACKET_SIZE,则当我以20kmsg / s的速度提供数据时,服务器运行良好。

当UDP_RECEIVE_PACKET_SIZE没有改变时,是否有任何建议可以避免OOM例外?

感谢您提供任何帮助/见解

1 个答案:

答案 0 :(得分:0)

是一个错误并在最新版本中修复,因此将成为Netty 4.0.0.Final的一部分。

请参阅http://github.com/netty/netty/issues/1388