内存尖峰-提高ASIO异步读取
Memory SPIKE - Boost ASIO ASYNC read
写一个只从客户端读取数据的服务器:
使用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.)甚至停止了ioservice,但仍然没有变化。
在第二次运行客户端时,我看到内存在增加。会是什么情况呢?我正在使用boost::数组,这是一个堆栈变量,只是简单地读取。
Raja,
首先,你是否意识到async_read_some不能保证你将读取整个READ_BLOCK_SIZE?如果你需要这种保证,我建议你使用async_read来代替。
现在,回到最初的问题,你的情况很典型。所以,基本上,你需要一个容器(数组)来保存数据直到被发送,然后你需要删除它。我强烈建议您切换到boost shared_array。你可以像boost数组一样使用它,但是它有一个内置的引用计数器,所以当对象不再需要时,它将被删除。
相关文章:
- 提升::Asio 异步聊天客户端停止与服务器通信
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 提升 ASIO:异步写入,同步
- Boost.Asio 异步服务器.限制为一个连接
- 运行 boost::asio 异步服务器以及命令循环
- Boost ASIO-异步堆栈 民意调查
- boost::bind with member functions(作为boost::asio异步写入处理程序)
- Boost ASIO:异步数据读数
- UDP Boost ASIO 异步客户端挂起
- 关于boost.asio异步睡眠
- Boost Asio异步:服务器已向客户端发送消息
- 使用带有boost::asio异步操作的自定义streambuf
- C++ ASIO:异步套接字和线程
- 在 boost asio 异步服务器中执行计算 taks
- 如何阻止 boost::asio 异步读取混淆
- 接受Boost ASIO异步处理程序
- 我可以在 boost::asio 异步模式下创建和接受套接字时使用 boost::shared_ptr 吗?
- 如何安全地取消提升 ASIO 异步接受操作
- 使用boost::asio异步发送自动变量.这可能吗?
- 如何调用boost::asio异步函数