堆内存管理详解:从堆块到低碎片堆(LFH)
创作时间:
作者:
@小白创作中心
堆内存管理详解:从堆块到低碎片堆(LFH)
引用
CSDN
1.
https://blog.csdn.net/weixin_44531336/article/details/125196022
堆内存管理是计算机系统中的一个重要概念,对于理解程序运行机制和优化内存使用具有重要意义。本文将从堆块、堆管理器函数、CRT分配函数、内存分配与释放机制以及低碎片堆(LFH)等方面,深入探讨Windows系统下的堆内存管理机制。
1. 堆块
堆块是堆内存管理中的基本单位。当我们调用malloc或new分配内存时,操作系统会自动分配一个堆块,并将可操作部分(即用户数据区)的首地址返回给我们。堆块的分配和释放涉及到堆的内存分割和合并等操作。
2. 堆管理器中的相关函数
堆管理器提供了HeapAlloc和HeapFree函数用于分配和释放堆内存。HeapAlloc函数的声明如下:
DECLSPEC_ALLOCATOR LPVOID HeapAlloc(
[in] HANDLE hHeap, // 一个堆的内存句柄
[in] DWORD dwFlags,
[in] SIZE_T dwBytes // 需要的内存块的字节数
);
调用成功时,返回指向所分配堆块中用户可以使用的区域的指针。实际上,HeapAlloc函数是RtlAllocateHeap函数的简单包装。
3. CRT分配函数
编译器的运行时库在初始化阶段会创建CRT堆,这个堆主要用于支持malloc和new等内存分配函数。在VS2010编译器的Release版本中,malloc和new最终都会调用HeapAlloc函数。
4. 分配和释放简单总结
new/delete是一对,malloc/free是一对,HeapAlloc/HeapFree是一对。- 调用顺序:
new/delete -> malloc/free -> HeapAlloc/HeapFree -> RtlAllocateHeap/RtlFreeHeap。 - 在Release版本中,
new/delete通常直接被编译为跳转指令;在Debug版本中,会加入很多内存检查功能。 free和delete释放的堆上内存不一定归还给系统,需要满足特定条件才会调用NtFreeVitrualMemory函数释放堆内存给系统。
5. 扩展:低碎片堆(LFH)
堆碎片化问题可以通过低碎片堆(LFH)来解决。LFH通过桶(buckets)来管理分配的堆块,将已分配的内存块映射为事先确定了不同大小范围的桶。LFH将可用空间划分成128个桶,每个桶的空间依次递增。
6. 参考资料
- 《软件调试》第二版,卷2的第23章
- 《Windows高级调试》,第6章
- 《深入解析Windows操作系统》第七版,第五章
- 《Windows编程调试技术内幕》
热门推荐
AP课程成绩可以申请香港的大学吗?
新能源和可再生能源装机历史性超过煤电 山东能源结构告别“一煤独大”
比亚迪第500万和第700万辆新能源车,为什么都在济南下线?
词穷、文字失语?在深度阅读中扩展表意空间
右手大拇指麻木是什么原因
右手大拇指麻木是什么原因
龙须树的盆栽技巧(选择盆栽、土壤与养护)
外企项目管理职位详解:职责、技能要求与工作方法
中部六省经济实力大比拼:河南稳居第一,安徽力压湖南
羽衣甘蓝要焯水吗
掌握打发淡奶油的技巧,提升甜品风味的秘密所在
装饰奶油蛋糕的做法,装饰奶油蛋糕的做法窍门
重症医学科:守护生命的最后一道防线
离职证明薪资信息如何避免被新公司核查
公孙策:包拯的首席智囊,为何却被推上虎头铡问斩,原因让人唏嘘
中国十大顶级硬菜,品味华夏饮食瑰宝
防控耐药风险,守护生物安全,张文宏等专家这样建议
留刘海会挡财运是真的吗?从风水学到科学的全面解析
促进肠道蠕动的六大方法
如何批量删除电脑上的空文件夹
法定盈余公积的计算方法、注意事项及其用途
提取法定盈余公积顺序是什么?法律实务中的重要性与操作规范
赛博朋克2077:最强刀剑流加点和义体推荐攻略
简历填写顺序
清朝王爷载涛:饿死不卖国,受到主席亲自接见,死后被葬入八宝山
单反相机的快门寿命是多少次?三种方法查看快门使用次数
新加坡养老服务和智慧养老模式,是否值得我们借鉴?
销售管理如何用 AI 工具提升转化效率?
深度解析:如何用Pulsar滤杯冲煮出完美咖啡
五行取名喜用神:如何根据生辰八字选择吉祥名字