内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。
为什么使用内存池项目
内存频繁使用,碎片化,
提高分配效率
多线程malloc枷锁效率更低
内存利用率低
概念普及:
定长内存池
变长内存池
定长内存分配器项目:
Boost.Pool、SGI STL的allocator、Loki的SmallObjAllocator、tcmalloc、jemalloc等。
变长分配器项目:
Obstack、Apache Portable Runtime里的apr_pool、许式伟StdExt里的AutoFreeAlloc和ScopeAlloc等。
社区建议:自己不要写内存池:
定长主要项目介绍:
Facebook jemalloc
https://github.com/jemalloc/jemalloc
6.6K
Jemalloc/C
优点:目前是 Maridab 、Tengine、Redis 中默认推荐的内存优化工具,所以使用 Jemalloc 对这些程序的兼容度还是比较高的。而且经过测试高负载情况下 Jemalloc 更加优秀。安装过程方便,不用安装额外的库。
缺点:对使用最新的gcc编译不友好。
google/tcmalloc
2.4K
开源协议:Apache license
TCMalloc/C++
优点:很多系统都可以用源来安装 TCMalloc ,而且支持的 gcc 编译库比较新。
缺点:软件是在 Google Perftools 下的,安装的时候如果不编译好可能会安装到我们不需要的其他软件,而且 Google Perftools 安装过程比较复杂还需要安装相应的库。
使用jemalloc或tcmalloc可以有效提升mysql的性能,强烈建议大家可以尝试。
jemalloc 用于后端偏中间件的项目使用
tcmalloc则偏前端项目使用
JeMalloc基于申请内存的大小把内存分配分为三个等级:small、large、huge。
Small objects的size以8字节、16字节、32字节等分隔开的,小于Page大小。
Large objects的size以Page为单位, 等差间隔排列,小于chunk(4MB)的大小。
Huge objects的大小是chunk大小的整数倍。
使用方法:
应用程序编译的时候直接link jemalloc.lib 也支持显示设置动态库的路径。
Jemalloc会自动hook malloc free 和realloc函数。
5.00+版本支持 new和delete操作符
Add C++ new/delete operator bindings. (@djwatson)
支持动态参数配置:malloc.conf
export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000";
总结
在多线程环境使用tcmalloc和jemalloc效果非常明显。
当线程数量固定,不会频繁创建退出的时候, 可以使用jemalloc;反之使用tcmalloc可能是更好的选择。
建议jemalloc作为项目内存池。
综合考虑下来,感觉jemalloc做为部署工具,用来在嵌入式系统或者内存不足的情况下给客户提供一种轻量部署机制即可,而非开发工具。
YY几句
不写博客的CXY水平不一定低
没见过公司嫌员工写纯技术记录博客的,双赢为什么不让做。