【问题标题】:Pool Garbage Collection Strategy池垃圾回收策略
【发布时间】:2011-10-27 14:19:42
【问题描述】:

我在我的应用程序中使用池来加快某些类型资源的分配:

例如

tbb::concurrent_unordered_map<size_t, tbb::concurrent_bounded_queue<resource>> pools;

std::shared_ptr<resource> create_resource(size_t size)
{
    auto pool = pools[size];

    std::shared_ptr<resource> resource;
    if(!pool->try_pop(resource))    
        resource.reset(new resource(size)); 

    return std::shared_ptr<host_buffer>(resource.get(), [=](resource*)
    {
        pool->push(resource);
    });
}

这很好用,但是我遇到了一些内存使用率高的问题。

如果我的应用程序中的资源使用发生变化,我有很多不需要的预分配资源,只会占用内存空间。

我需要某种策略,让我能够以某种方式检测何时不会再次分配某个池化资源并动态调整池,例如如果池的大小不小于 2 超过一秒,则释放一个资源。

对于可以使用哪些策略来最大程度地减少内存使用量,同时仍然保持池资源的大部分额外性能,是否有人有任何建议。

【问题讨论】:

    标签: c++ memory-management garbage-collection pool


    【解决方案1】:

    这是一个简单的解决方案:将队列的大小定义为 2^N(N 必须至少为 2),当池大于 2^N 时,将 N 加一,当队列小于2^(N-2),你将 N 减为一个单位。

    这是一个非常轻量级的想法,可以在很多情况下使用。

    【讨论】:

    • 除非他可以重新排列内部数据,否则这是行不通的,而池可能无法做到这一点。
    • 是的,这是一个限制。但是您可以使用指针使您的资源可重新排列。
    • 另外,我刚刚意识到这确实适用于内部队列。我的错。
    • 听上去是一种简单又好用的方法,但是在资源量大而资源量少的情况下,它就有点不理想了。
    【解决方案2】:

    我通过保持池使用统计并每秒刷新一次来解决它。

    【讨论】:

      猜你喜欢
      • 2012-04-20
      • 1970-01-01
      • 2023-04-03
      • 2011-12-21
      • 2012-01-28
      • 2013-06-27
      • 2011-11-29
      • 2021-12-20
      • 2011-07-15
      相关资源
      最近更新 更多