我已经开始将boost池用作boost / pool / singleton_pool.hpp中定义的singleton,因为我需要重复分配大量相同大小的结构。由于我之前使用的是malloc,因此性能提升非常出色。
我分配的对象由生产者线程放入列表中,而消费者线程将这些对象从另一端取出并释放对象。但是当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定量的内存?
此外,当生产者的数据速率增加时,总内存使用量似乎以块的形式增加~10k,但即使在为池中的对象调用free之后也永远不会减少。
我想定期做一些内容来释放内存块以减少进程的整体内存使用量。这可能吗?我不能使用purge_memory,因为这意味着我必须在产品和消费者之间同步清除。 BTW会使purge_memory释放块,即减少任务管理器中的内存使用量吗?
我在MS windows中编程。
由于 Niladri
PS - 我尝试通过使池命令(ordered_malloc)来使用release_memory,但它总是返回false。
更新:
还没有尝试过purge_memory,因为池在两个线程之间共享。但是发现release_memory只能用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。
我确信,清除工作会更快。
答案 0 :(得分:3)
根据doc:
bool t.release_memory()
必须订购。释放没有任何已分配块的每个内存块。如果至少释放了一个内存块,则返回true。
bool t.purge_memory()
释放每个内存块。此函数使先前由t的分配函数返回的任何指针无效。如果至少释放了一个内存块,则返回true。
为了释放你的记忆,你需要使用purge_memory()
。 只有当您通过池中的每个指针都不再使用时,您才能这样做!
如果release_memory
返回true,那么您的记忆似乎仍在使用中......
MY2C
答案 1 :(得分:1)
这就是boost::pool
的工作方式,这就是您的分配如此之快的原因。当您取消分配对象时,您实际上并没有取消分配任何内容。 boost::pool
基本上是说内存区域可用于该大小的另一个对象。所以不,当你释放对象时,你不会看到你的内存使用率下降,因为这就是对象池的工作方式。您有一块预先分配的内存,并使用该块内存来创建对象。一个“对象池”,因为它是:)
答案 2 :(得分:-1)
还没有尝试过purge_memory,因为池在两个线程之间共享。 但是发现release_memory只能用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。
我确信,清除工作会更快。