池垃圾收集策略

时间:2011-08-15 20:54:32

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

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

e.g。

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超过一秒,则释放一个资源。

是否有人就可以使用哪些策略来最小化内存使用量,同时仍然保留池资源的大部分额外性能有任何建议。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我通过保持池使用情况的统计数据来解决它,并每秒刷新它。