关于内存碎片的问题,网上可以搜到大把,这里就不简述了。不知道有多少同学真正遇到过由这个导致的问题,我暂时是没有遇到,但是每次在写相关程序时难免会有这方面的担心,比如我收了一个包,简单的做法就是直接对该包进行处理,然后接着处理下一个包。如果想提高吞吐,可以分配一块内存将该包copy过去,然后再异步处理(这里copy不一定需要),处理完毕后释放。作为短期运行的程序这样做也没什么问题,如果是包量比较大的服务程序,这样频繁的内存分配,释放难免会有内存碎片方面的担心。之前写了一个程序也是这个类似方式处理的,平均包量10w/s,运行了好几个月也没出现啥问题,陈硕有一篇文章也提到过关于内存碎片方面的看法http://blog.csdn.net/solstice/article/details/6527585,
今天和一位同事讨论,他说到了一些这方面的知识,现总结如下:
1不要过早优化和担心内存碎片
2优先使用容器,类似vector<char>,其次是malloc/free,配合使用tcmalloc,jemalloc等库
对于上述的内存分配方面还可以通过如下方法优化,采用内存池技术分配不定大小的内存块,然后通过一个类似如下的包装:
struct Pack
{
char* buffer;
std::size_t len;
};
再使用malloc/free分配Pack,这样对于同样大小的Pack对象,效率还是不错的。