windbg 调试来看XpSp3 heap
基本概念
堆 一个进程能有多个堆,+0x58指向堆中的第一个堆段,C++一般用HeapCreate创建,每个堆至少有一个堆段
堆段 一个堆最多有64个堆段,+0x20(FirstEntry)指向堆段中的第一个堆块,C++一般用HeapAlloc创建
堆块 实际的堆内存使用
关于堆的实际分配使用
堆管理器通过Windows虚拟内存管理器分配一大块内存(堆段),这块内存将被分为大小不同的堆块来满足实际的分配。 当一个堆段耗尽所有空间后,堆管理器将创建另一个新的堆段。
堆管理流程
堆管理包括前端堆管理和核心堆层管理两个部分,前端堆管理 主要用于快速的堆块分配以及被释放的堆块的重利用,因此在申请一个堆块的时候,会首先查询前端堆部分有没有可用的堆块,当没有的之后才会去查看核心堆管理。
前端堆管理 包括Lookaside list(快表),低碎片堆。
申请堆块 申请一个堆块,首先查看快表中是否有合适的堆块,若有则分配,若没有则继续查看freelist中是否有合适的堆块,若没有则正常划分一个空堆块分配。