• 自动分配的一块内存
  • 自底向上生长
  • 相关函数malloc /free

    堆管理器

  • dlmalloc -General purpose allocator

  • ptmalloc2-glibc (linux默认)
  • jemalloc -firefox/android
  • tcmalloc -chrome

    ptmalloc

    在以下特性找平衡

  • 速度

  • 节省空间
  • 轻便
  • 可调

    heap

  • 系统的内存空间有限,而用户内存需求又时常发生变化

  • ptmalloc 在用户和系统中间调度
  • 如果malloc size <128kb,从系统分配132kb ,这块称为main_arena ,之后小于128kb的请求都从main_arena 中切出
  • image.png

chunk

  • 堆的最基本单位
  • chunk头部prev_size,size(A|MP)
  • malloc 返回指针指向mem处

image.png

  • 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中特有

image.png

  • chunk 空间复用

    • P标志位为1

      • 上一个chunk是used
      • prev_size 域用于存放user-data
    • P标志位为0

      • 上一个chunk是freed
      • 合并时使用prev_size 定位上一个chunk

image.png

  • topchunk
  • malloc后将内存分为两块,剩余称为topchunk
    • size显示剩余空间