C++性能优化(十一) —— 内存管理器性能分析

C++性能优化(十一) —— 内存管理器性能分析

1、PTMalloc2

一、PTMalloc2优势

(1)集成在glibc中,Linux主要发行版的通用实现。缓存

二、PTMalloc2缺点

(1)后分配的内存先释放。因为ptmalloc2收缩内存是从top chunk开始,若是与top chunk相邻的chunk不能释放,top chunk 如下的chunk都没法释放。
(2)多线程锁开销大,须要避免多线程频繁分配释放。
(3)内存从thread的arena中分配,不能从一个arena移动到另外一个arena。若是多线程使用内存不均衡,容易致使内存的浪费。
(4)每一个chunk至少8字节的开销很大。
(5)不按期分配长生命周期的内存容易形成内存碎片,不利于回收。 性能优化

2、TCMalloc

一、TCMalloc优势

(1)小内存在线程ThreadCache中分配,不加锁(加锁代价大约100ns)。
(2)大内存直接按照大小调用mmap系统调用分配。
(3)大内存加锁使用更高效的自旋锁。
(4)减小内存碎片。多线程

二、TCMalloc缺点

(1)使用大内存频繁时,内存在Central Cache或者Page Heap加锁分配。
(2)TCMalloc对大量小内存的分配过于保守,对于内存需求较大的服务(如推荐系统),小内存上限太低。若是请求量过多,锁冲突严重,CPU使用率将指数暴增。ide

三、TCMalloc使用场景

当线程数量不定时,使用TCMalloc。性能

3、JeMalloc

一、JeMalloc优势

(1)采用多个arena来避免线程同步。
(2)使用细粒度锁,大大减小加锁。
(3)TCache GC时对缓存容量进行动态调整。优化

二、JeMalloc缺点

JeMalloc内存分配器的缺点在于arena 间的内存不可见。
(1)某个线程在arena使用了大量内存,但arena 并无其它线程使用,致使arena 内存没法被回收,占用过多。
(2)两个位于不一样arena的线程频繁进行内存申请,致使两个arena的内存出现大量交叉,但连续的内存因为在不一样arena而没法进行合并。线程

三、JeMalloc使用场景

当线程数量固定,不会频繁建立退出时,可使用jemalloc。blog

4、不一样内存管理器性能比较

C++性能优化(十一) —— 内存管理器性能分析

相关文章
相关标签/搜索