堆
- 自动分配的一块内存
- 自底向上生长
-
堆管理器
dlmalloc -General purpose allocator
- ptmalloc2-glibc (linux默认)
- jemalloc -firefox/android
-
ptmalloc
在以下特性找平衡
速度
- 节省空间
- 轻便
-
heap
系统的内存空间有限,而用户内存需求又时常发生变化
- ptmalloc 在用户和系统中间调度
- 如果malloc size <128kb,从系统分配132kb ,这块称为main_arena ,之后小于128kb的请求都从main_arena 中切出
chunk
- 堆的最基本单位
- chunk头部prev_size,size(A|MP)
- malloc 返回指针指向mem处
- P (PREV_INUSE)连续空间的上一个chunk是否在使用
- M(IS_MMAPPED)是否是通过mmap分配的chunk
- A(NON_MAIN_ARENA)是否属于main_arena
- 0代表chunk属于main_arena
- freed chunk
- prev_size /size
- fd 指向链表中下一个chunk
- bk 指向链表中上一个chunk
- fd_nextsize /bk_nextsize
- larg bin中特有
chunk 空间复用
P标志位为1
- 上一个chunk是used
- prev_size 域用于存放user-data
P标志位为0
- 上一个chunk是freed
- 合并时使用prev_size 定位上一个chunk
- topchunk
- malloc后将内存分为两块,剩余称为topchunk
- size显示剩余空间