Netty ByteBuf 占用所有内存

Posted

技术标签:

【中文标题】Netty ByteBuf 占用所有内存【英文标题】:Netty ByteBuf occupies all memory 【发布时间】:2014-09-25 22:29:43 【问题描述】:

我写了一个简单的代码来测试我的服务器的性能

        while (true) 
            ByteBuf firstMessage = Unpooled.buffer(8);
            firstMessage.writeInt(1);
            firstMessage.writeInt(1);
            firstMessage.writeLong(1L);
            f.channel().writeAndFlush(firstMessage);
        

30 秒后:

所有内存占用 服务器停止接收新消息

对不起我的英语

【问题讨论】:

【参考方案1】:

您创建新缓冲区(堆上)的速度可能比通过网络在单个通道上发送它们的速度要快,因此最终它们会消耗整个堆,并且您会遇到 OOM 问题。

【讨论】:

【参考方案2】:

我认为您最好在冲洗完成后尝试致电firstMessage.release()。在ByteBuf 规范中,表明ByteBuffer 正在实现ReferenceCounted

【讨论】:

【参考方案3】:

您无需继续重新创建该缓冲区。要么在循环内释放它,要么在循环开始之前创建它,然后在循环内重置它。

【讨论】:

以上是关于Netty ByteBuf 占用所有内存的主要内容,如果未能解决你的问题,请参考以下文章

支撑百万级并发,Netty如何实现高性能内存管理

Netty 之缓冲区 ByteBuf 解读

Netty中ByteBuf内存泄露及释放解析(转)

Netty中ByteBuf内存泄露及释放解析(转)

Netty入门——ByteBuf

为啥 Netty ByteBuf.readBytes 会导致内存泄漏?