转自: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

五、参考