堆内存管理详解:从堆块到低碎片堆(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:一针就能终身降胆固醇;开启了突破性的基因疗法
如何分析期权市场的最大持仓?这些持仓数据对投资者有何参考价值?
如何分析期权市场的最大持仓量?这些持仓量对市场波动有何启示?
Ubuntu系统中ibus中文输入法配置指南
借贷记账法在企业经营中的应用案例分析
医生提醒:冰西瓜、冰饮料吃多了,当心这三大危害
中医如何改善头晕昏沉的问题
什么是刹车油类型
来了济南不迷路!保姆级大明湖攻略给你带路
如何轻松干净的更换CPU导热硅脂及小工具分享
减肥吃开心果还是腰果?营养师教你做出明智选择
黑桑葚的功效是什么
抽血过多对身体有什么影响
历代张天师世系表:从第一代至今!
张天师斩五毒:道教信仰与端午节的文化交融
猪场该如何优化管理方式,提升养猪生产效益?
种猪各阶段精准营养与饲喂管理
大侦探8凶手之谜:法律视角下的推理与正义探索
防爆高能点火器如何保养和维护?
一位留学生分享:如何记录我的澳洲留学生活
鸡血的功效与作用 鸡血和什么搭配最好
注销手机号时,这几件事一定要做!
芬太尼是什么?强效止痛药的双刃剑
如何提高高层住宅的窗户密封性?窗户密封不当会有哪些后果?
有趣的课间游戏有哪些?课间十分钟,玩转10个超有趣的游戏!