堆内存管理详解:从堆块到低碎片堆(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编程调试技术内幕》
热门推荐
升主动脉增宽到什么程度有危险?
口腔局部用氟的种类及使用方法
食品饮料大全:种类、保存时间与使用方法
手链珠子数量选择:单数好还是双数好?
舒肥猪排:保持猪排湿润鲜嫩的完美烹饪方法
煎猪排用猪的哪个部位
通过微信能查到对方的位置吗?
手术机器人:新质生产力的典范
再现传统节日魅力,“我们的节日·冬节”主题展开幕
无花果的肥料选择(无花果生长的关键在于肥料,选对肥料助力无花果茁壮成长)
降准对股市会产生怎样的作用?这种作用是长期的还是短期的?
航海技术专业主要学什么-专业课程有哪些
公务员辞职后社保缴纳问题解答
光催化新突破!李灿院士团队在Nature子刊发表重要研究成果
特种设备安全培训课件
古人死后为何要等七天才下葬?有一个重要原因
北京国际学术交流季—量子物质基础研究国际会议在京召开
《召公谏厉王止谤》文言文原文注释翻译
从入门到精通制作三维动画的过程,帮助读者掌握这个技能
学3d动画制作需要学什么?从入门到精通的学习内容详解
在路边,邂逅浪漫音乐会
AI开源社区中的创新力量:从贡献者到实践者的成长故事
瓷砖美缝预留尺寸小秘密,美缝与不美缝分别需要留多大尺寸?
月度工作计划怎么写
工业大风扇降温效果怎么样?适合哪些场所
重报观察|川渝产业园区跨区域合作的那些事儿
腰痛时该挂哪个科室?一文读懂四大科室的区别
韩国国旗太极旗图片及其易经元素含义
韩国国旗太极旗图片及其易经元素含义
《黑神话》和《哪吒2》谁更出圈?游戏与动画的较量