任何人都可以指向源代码或概述低碎片堆的算法是如何工作的吗?防止内存碎片
Q
防止内存碎片
2
A
回答
1
首先确定要为分配的内存块使用哪个“倍数”。我通常使用8个字节。
在应用程序启动时,制作一个矢量,矢量中的每个元素指向内存块的“池”。向量中的第一个索引将用于8字节或更少的内存分配。向量中的第二个索引将用于9-16字节的内存分配,依此类推。
在每个池中,以更大的块分配内存。例如。在分配8个字节(或更少)的池中,不要分配8个字节,而是分配N个8个字节。在池中记住应用程序中真正分配了哪些部分以及哪些部分正在等待分配。
释放内存时,不要立即释放内存,但请保留一些块以备下一次分配。 仅当您有大量后续空闲块时,才将可用内存返回到操作系统。
这就是基本的想法。其余的是实现池(通常是链表的块)。
困难的部分是将堆实现集成到应用程序中。
- 如果你还在使用malloc /免费,使用#定义的重新定义malloc和free
- 如果您使用新/删除,定义全局new和delete操作
而且看看How to solve Memory Fragmentation,并且在Memory management in memory intensive application
1
我的评论从MSDN:
LFH不是一个单独的堆。相反,这是应用程序可以启用堆栈的策略。当启用LFH时,系统会以特定的预定大小分配内存。当应用程序从启用了LFH的堆中请求内存分配时,系统会分配足够大的最小内存块以包含所请求的大小。
这个策略被许多内存管理器使用,虽然细节可能会有所不同。
相关问题
- 1. 如何防止APC缓存碎片
- 2. 防止文件碎片
- 3. 内存碎片
- 4. Flash/ActionScript内存碎片
- 5. 内存碎片@ boost :: asio?
- 6. 用新的预防内存碎片 - 删除技巧
- 7. 内部和外部内存碎片
- 8. 避免内存碎片的方法
- 9. 碎片内存是什么样的?
- 10. 堆分离解决内存碎片
- 11. ButterKnife内存安全保留碎片吗?
- 12. iOS如何解决内存碎片?
- 13. 堆碎片和Windows内存管理器
- 14. C++新的内存分配碎片
- 15. rails碎片缓存存储
- 16. 防止内存溢出
- 17. 如何防止HttpWebRequest的数据包碎片
- 18. 在C内存池中对内存块进行碎片整理
- 19. 内部和外部碎片
- 20. MINIX内部碎片2
- 21. Android碎片保留内容
- 22. TInyMCE - 防止粘贴破碎的HTML?
- 23. Rails碎片缓存策略
- 24. APC缓存碎片问题
- 25. 保存碎片状态
- 26. 如何防止GD耗尽内存?
- 27. 如何防止内存泄漏
- 28. 如何防止MS-Word内存错误
- 29. 使用instantiateViewController时防止内存泄漏
- 30. 防止Gearman耗尽系统内存
这听起来像大多数人正在阅读的问题,“如何创建和分配最小碎片?”。但我认为作者的意思是“Windows的低碎片堆使用哪种算法?”这个问题的答案不会出现在简单的搜索中。 – 2010-02-16 21:38:15