【问题标题】:Boost POOL usage - singleton提升 POOL 使用率 - 单例
【发布时间】:2011-01-27 22:56:36
【问题描述】:

我已经开始使用 boost 池作为在 boost/pool/singleton_pool.hpp 中定义的单例,因为我需要重复分配许多相同大小的结构。与我之前使用 malloc 一样,性能提升非常显着。

我分配的对象由生产者线程放入列表中,消费者线程将这些对象从另一端取出并释放对象。但是当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定数量的内存?

此外,当生产者的数据速率增加时,总内存使用量似乎会以块的形式增加 ~ 10k,但即使在为池中的对象调用 free 之后也不会减少。

我想定期做一些内务管理以释放内存块以减少进程的整体内存使用量。这可能吗?我不能使用 purge_memory ,因为这意味着我必须在生产者和消费者之间同步清除。顺便说一句,purge_memory 是否会释放块,即减少任务管理器中的内存使用量?

我正在 MS windows 中编程。

谢谢 尼拉德里

PS - 我尝试使用 release_memory 通过使池排序 (ordered_malloc) 但它总是返回 false。

更新:

尚未尝试 purge_memory,因为池在两个线程之间共享。但是发现 release_memory 只适用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。

我确信清除会更快。

【问题讨论】:

  • 如果它很慢是因为它没有释放使用过的内存,对我来说这是一个特性,不是问题:) 你可以向你的线程发送一个命令来暂停/停止处理并禁止使用内存,在调用 purge 之前?您尝试解决的具体用例是什么?

标签: c++ boost


【解决方案1】:

根据doc

bool t.release_memory()

t 必须订购。释放没有任何已分配块的每个内存块。如果至少一个内存块被释放,则返回 true。

bool t.purge_memory()

释放每个内存块。此函数使先前由 t 的分配函数返回的任何指针无效。如果至少有一个内存块被释放,则返回 true。

所以要释放你的内存,你需要使用purge_memory()只有当你从池中获得的每个指针都不再被使用时,你才能这样做!

如果release_memory返回true,看来你的内存还在使用中……

my2c

【讨论】:

  • 谢谢,当至少一个内存块被释放时,relase_memory 返回 true。在我的情况下它总是返回 false,即使我已经确保我已经为每个 ordered_malloc 调用了 free。
  • @user:我最好的猜测是你需要使用 purge_memory ......我在 linux 上,所以我不能做测试......
  • boost::pool 文档,据我所知,至少在当前版本 1.5.5 中,完全没有说明 release_memorypurge_memory 之间的区别。我很高兴看到这个帖子。
  • @Dan:那是发帖时的 1.45.0 版本。他们可能已经改变了行为......检查代码!
【解决方案2】:

这就是boost::pool 的工作原理,这就是您的分配如此之快的原因。当你取消分配一个对象时,你并没有真正取消分配任何东西。 boost::pool 基本上是说内存区域可用于该大小的另一个对象。所以不,当你释放对象时你不会看到你的内存使用量下降,因为这就是对象池的工作方式。你有一块预先分配的内存,你使用那块内存来创建你的对象。一个“对象池”,就像它一样:)

【讨论】:

  • 谢谢,这证实了我的假设。有没有办法销毁这个对象池并重新开始?
  • 或一种找出块存在方式的方法?
  • @user544550,正如神经在下面指出的那样,purge_memory 摆脱了它,但正如他所说,任何分配的对象现在都是垃圾。
【解决方案3】:

尚未尝试 purge_memory,因为该池在两个线程之间共享。 但是发现 release_memory 只适用于有序池,并且释放内存很慢,因为它只释放没有分配的内存块。

我确信清除会更快。

【讨论】:

  • 请不要使用答案来发布您的问题的更新。向您的问题添加评论,或使用 EDIT 按钮将更新附加到您的原始问题。这是为了确保人们在花时间编写可能不再相关的答案之前及时了解您的问题/问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多