堆基础

  • 在进行堆溢出之前

Windows堆管理器可以划分为前段分配器和后端分配器

Windows vista以后的版本都默认采用了低碎片前端分配器.低碎片前端分配器非常复杂,其主要思想就是通过分配足够容纳请求大小的最小内存快来减少堆碎片

分配器

  • 如果前端分配器无法满足,则这个请求将被转发到后端分配器,在winxp中,与前端分配器类似的是,后端分配器也有一张空闲列表,表中的每一项都是一个空闲链表。空闲列表的作用就是记录在指定堆中的所有空闲堆块,在空闲列表索引为0的项中的堆块大小大于1016字节而小于虚拟内存分配的限制(0x777F0字节)

  • 其实说了半天,在win7中就没有专门的特定尺寸的空闲堆块了,Windows7使用单个空闲链表,该链表中包含了所有吃春的空闲对砍,大小按照圣序排列,与此同时,还有另一种链表,该链表结点的类型为listhint,该链表的结点指向了空闲链表中的结点,用来找到合适大小的结点来满足内存分配的要求。

堆段

  • 堆管理器通过windows虚拟内存管理器来分配一大块内存,堆管理器从虚拟内存管理器请求分配的内存块被称为堆块

  • 当堆管理器耗尽了已提交的空间时,堆段将进一步提交更多的内存,而堆管理器将对新提交的空间进行分割,当一个堆段耗尽了所有空间后,堆管理器将创建另一个新的堆段。并且新的堆段的大小将是之前堆段大小的两倍。

文章目录
  1. 1. 在进行堆溢出之前
  2. 2. 分配器
  3. 3. 堆段