内存优化
选择合适的内存管理算法会带来明显的性能提升
内存管理自底向上分为
1.操作系统内核的内存管理
2.glibc层使用系统调用维护的内存管理算法
3.应用程序从glibc动态分配内存后,根据应用程序本身的程序特性进行优化
优秀的通用内存分配器应具有的特性
额外的空间损耗尽量少
分配速度尽可能快
尽量避免内存碎片
缓存本地化友好
通用性,兼容性,可移植性,易调试
服务端程序使用glibc提供的malloc/free系列函数,而glibc使用的ptmalloc2
Ptmalloc
Ptmalloc采用主-从分配区的模式,当一个线程需要分配资源的时候,从链表中找到一个没加锁的分配区,在进行内存分配
线程数越多,Ptmalloc 出现锁竞争的概率就越高
内存分配还有TCMalloc 和JEMalloc
TCMalloc 是Google开源的一个内存管理库
TCMalloc为每个线程分配了一个线程本地ThreadCache
小对象(<=32K)从ThreadCache分配,大对象从CentralCache分配
ThreadCache不够用的时候,会从CentralCache中获取空间放到ThreadCache中
TCMalloc比较适合在多线程环境下分配 256KB 以下的内存
JEMalloc
JEMalloc是facebook推出的
与tcmalloc类似,每个线程同样在<32KB的时候无锁使用线程本地cache
Jemalloc和tcmalloc类似的线程本地缓存,避免锁的竞争
在多线程环境使用tcmalloc和jemalloc效果非常明显,Ptmalloc 更擅长大内存的分配
当线程数量固定,不会频繁创建退出的时候, 可以使用jemalloc;反之使用tcmalloc可能是更好的选择