转自:[https://blog.51cto.com/u_9291927/2575317](https://blog.51cto.com/u_9291927/2575317) # 一、PTMalloc2 ## 1、PTMalloc2优点 1. 集成在glibc中,Linux主要发行版的通用实现。 ## 2、PTMalloc2缺点 1. 后分配的内存先释放。由于ptmalloc2收缩内存是从top chunk开始,如果与top chunk相邻的chunk不能释放,top chunk 以下的chunk都无法释放。 2. 多线程锁开销大,需要避免多线程频繁分配释放。 3. 内存从thread的arena中分配,不能从一个arena移动到另一个arena。如果多线程使用内存不均衡,容易导致内存的浪费。 4. 每个chunk至少8字节的开销很大。 5. 不定期分配长生命周期的内存容易造成内存碎片,不利于回收。 # 二、TCMalloc ## 1、TCMalloc优点 1. 小内存在线程ThreadCache中分配,不加锁(加锁代价大约100ns)。 2. 大内存直接按照大小调用mmap系统调用分配。 3. 大内存加锁使用更高效的自旋锁。 4. 减少内存碎片。 ## 2、TCMalloc缺点 1. 使用大内存频繁时,内存在Central Cache或者Page Heap加锁分配。 2. TCMalloc对大量小内存的分配过于保守,对于内存需求较大的服务(如推荐系统),小内存上限过低。如果请求量过多,锁冲突严重,CPU使用率将指数暴增。 ## 3、TCMalloc使用场景 当线程数量不定时,使用TCMalloc。 # 三、JeMalloc ## 1、JeMalloc优点 1. 采用多个arena来避免线程同步。 2. 使用细粒度锁,大大减少加锁。 3. TCache GC时对缓存容量进行动态调整。 ## 2、JeMalloc缺点 JeMalloc内存分配器的缺点在于arena 间的内存不可见。 1. 某个线程在arena使用了大量内存,但arena 并没有其它线程使用,导致arena 内存无法被回收,占用过多。 2. 两个位于不同arena的线程频繁进行内存申请,导致两个arena的内存出现大量交叉,但连续的内存由于在不同arena而无法进行合并。 ## 3、JeMalloc使用场景 当线程数量固定,不会频繁创建退出时,可以使用jemalloc。 # 四、不同内存管理器性能比较 ![img](../../../../../ff_internal_upload/img/2020/cbdde07f8fb705574f3dd69c3aa7fc4c.jpg) # 五、参考 - [内存优化总结:ptmalloc、tcmalloc和jemalloc](https://www.cnblogs.com/cthon/p/10563946.html)