gpt4 book ai didi

c++ - Memory SPIKE - boost ASIO 异步读取

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:51:59 27 4
gpt4 key购买 nike

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

使用 boost::array 缓冲区

启动服务器,系统监视器显示 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,它是一个堆栈变量,只是读取。没有其他地方有正在初始化的缓冲区。

最佳答案

拉贾,

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

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

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

关于c++ - Memory SPIKE - boost ASIO 异步读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571209/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com