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

2021-03-08 14:29

阅读:531

标签:http   冲突   优点   回收   直接   没有   内存分配   info   缓存   

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

一、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。

四、不同内存管理器性能比较

技术图片

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

标签:http   冲突   优点   回收   直接   没有   内存分配   info   缓存   

原文地址:https://blog.51cto.com/9291927/2575317


评论


亲,登录后才可以留言!