内存SPIKE - 提升ASIO ASYNC读取

时间:2011-09-27 14:54:44

标签: 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))
    );
}

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

拉​​加,

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

现在,回到最初的问题,你的情况非常典型。所以,基本上,你需要一个容器(数组)来保存数据直到发送,然后你需要摆脱它。

我强烈建议您切换到提升shared_array。您可以像使用boost数组一样使用它,但它有一个内置的引用计数器,因此当不再需要该对象时将删除该对象。这应该可以解决你的内存泄漏问题。