Ptmalloc
内存分配
- Ptmalloc有多个area,包括一个在堆上分配内存的主分配区和使用mmap分配内存的非主分配区,使用area分配内存、释放内存、合并相邻空闲chunk都需要加锁。Ptmalloc分配内存时尝试获取一个可以加上锁的area,如果获取不到并且area没有超过上限会创建一个新的area;当达到area上限且加锁失败会循环尝试加锁直到获取到一个area。
- 用户请求分配的内存Ptmalloc中使用chunk表示, 每个chunk至少需要8个字节额外的开销。 Ptmalloc 将相似大小的chunk 用双向链表链接起来, 这样的一个链表被称为一个 bin。Ptmalloc 一共 维护了128 个bin,并使用一个数组来存储这些 bin。
- Ptmalloc会将分配的内存大小按16字节向上对齐,在内存池中找到相似大小的chunk并直接使用,如果找不到则找更大的chunk,然后拆为两部分,一部分分配给用户,一部分重新链接到合适的chunk下。
- 如果内存池中获取失败则会向系统申请。
内存优化总结:ptmalloc、tcmalloc和jemalloc
内存释放
- Ptmalloc中,所有调用delete释放的内存,并不是立即调用brk(sbrk)归还给操作系统,而是先将这个内存块挂在free-list里面进行内存归并(相邻的可用内存块合并