内存SPIKE - 提升ASIO ASYNC读取

Raj*_*aja 5 c++ boost boost-asio

写了一个只从客户端读取数据的服务器:

使用boost :: array buffer

启动服务器和系统监视器显示1MB的使用情况.

1.)只需执行async_read_some并执行handleRead,我再次调用asyncRead函数.

void asyncRead() {
    m_socket->async_read_some(
        boost::asio::buffer(m_readBuffer, READ_BLOCK_SIZE),
        m_strand->wrap(boost::bind(&ConnectionHandler::handleRead,
                                   shared_from_this(),
                                   boost::asio::placeholders::error,
                                   boost::asio::placeholders::bytes_transferred))
    );
}
Run Code Online (Sandbox Code Playgroud)

在handleRead我验证是否有任何错误,如果没有,我只是发出另一个asyncRead().

2.)保持发送帧(大小约102字节的数据).

在10000帧的测试结束时.总发送大小= 102*10000总读取大小= 102*10000

但是,系统监视器中的内存使用量高达7.8 Mb.

无法弄清楚这种增加的原因.尝试的不同方面是:1.)正在进行的连接数量 - 仅1. 2.)已验证关闭连接 - 是的.3.)甚至停止了ioServic,但仍然没有变化.

在客户端的第二次运行中,我看到内存在增加.可能是这样的?我使用的是boost :: array,这是一个堆栈变量,只是阅读.没有其他地方有一个缓冲区被初始化.

Asi*_*rez 0

拉贾,

首先,您是否知道 async_read_some 并不能保证您将读取整个 READ_BLOCK_SIZE ?如果您需要这种保证,我建议您改用 async_read 。

现在回到最初的问题,你的情况很典型。因此,基本上,您需要一个容器(数组)来保存数据,直到发送为止,然后您需要删除它。

我强烈建议你改用 boost shared_array。你可以像boost array一样使用它,但它有一个内置的引用计数器,所以当不再需要该对象时,它会被删除。这应该可以解决你的内存泄漏问题。