任何人都可以指向源代碼或概述低碎片堆的算法是如何工作的嗎?防止內存碎片
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. SQLite的:防止碎片
- 3. 防止文件碎片
- 4. 內存碎片
- 5. cuda內存碎片
- 6. SharpDX內存碎片
- 7. 如何驗證碎片中的EditText並防止碎片更改?
- 8. malloc和內存碎片
- 9. 內存碎片@ boost :: asio?
- 10. 內存碎片測試
- 11. Flash/ActionScript內存碎片
- 12. 碎片內的碎片或ListActivity內的碎片?
- 13. 用新的預防內存碎片 - 刪除技巧
- 14. 內部和外部內存碎片
- 15. 工具檢查內存碎片
- 16. Swift中如何避免內存碎片
- 17. 碎片內存是什麼樣的?
- 18. std :: vector交換導致內存碎片?
- 19. 堆分離解決內存碎片
- 20. C++新的內存分配碎片
- 21. ButterKnife內存安全保留碎片嗎?
- 22. 處理內存池中的碎片?
- 23. 避免內存碎片的方法
- 24. 大內存頁面和碎片
- 25. 在Python中計算內存碎片
- 26. iOS如何解決內存碎片?
- 27. 內存泄漏,位圖,碎片
- 28. 操作系統主內存碎片
- 29. 堆碎片和Windows內存管理器
- 30. OpenCL:防止內核緩存
這聽起來像大多數人正在閱讀的問題,「如何創建和分配最小碎片?」。但我認爲作者的意思是「Windows的低碎片堆使用哪種算法?」這個問題的答案不會出現在簡單的搜索中。 – 2010-02-16 21:38:15