堆内存管理详解:从堆块到低碎片堆(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编程调试技术内幕》
热门推荐
电脑使用过程中USB键盘突然失灵无反应,排查步骤
无产权阁楼可以买吗?法律专家解读交易风险
如何让对方父母同意结婚:实用技巧与建议
农村土地承包纠纷调解案例
山东青岛:科技赋能新旧动能转换
【专硕巡展】让“药”有活力,学“药”有所为
主动脉夹层的CTA表现
Excel表格中时间数据的提取方法详解
油表不动的原因是什么?如何解决油表故障问题?
残缺的艺术,超时空“旅行者”
主流社交媒体平台的特点与用户群体
面对老年痴呆病人拔掉输液针的情况应如何处理
中国空军成立75周年:那些值得铭记的中国航空英雄人物
不伤腰的腹肌锻炼方法
深度虚值期权合约适合购买吗?
汽车年检:全面了解年审流程与要求
实施精益生产方式的基础是5S管理
打造理想工作:从兴趣、能力和价值三个维度出发
员工提交离职申请是否可以让其当天离开?
借条没写利息起诉能要到利息吗
用好科技金融,锻造科创平台成果转化“金钥匙”
离婚3年后,37岁赵丽颖深夜发文,高调宣布喜讯,终于等到这一天
孩子近视防控,30问答
临猗至恩施大峡谷全景深度游:一次探索自然奇观与文化之旅
小公务员宋江的智谋:四步策略击败黑老大晁盖
未约定借款利息,逾期还款时利息如何计算
欧阳明高:选对全固态电池技术路线很重要
2024年中国城市排行榜:深圳广州之争,东莞佛山之别
如何有效优化企业采购流程——附优化工具列表
姜黄素是什么化合物?姜黄素结构式及理化性质介绍