我正在阅读Real World OCaml的Chapter 21 Understanding the Garbage Collector。 在部分内存分配策略,它说:第一次合适的分配算法如何减少内存碎片?
首先匹配分配
如果你的程序分配许多不同大小的值,你有时可能会发现,你的空闲列表变得支离破碎。在这种情况下,即使存在空闲块,GC也被迫执行昂贵的压缩,因为单独的块都不足以满足请求。
首先适合的分配重点在于减少内存碎片(并因此减少压缩次数),但是会以较慢的内存分配为代价。每次分配都会从一开始就扫描空闲列表以获得合适的空闲块,而不是将最新的堆块重新用作下一个合适的分配器。
我无法弄清楚如何分配首次适应减少内存碎片比较下一个匹配分配,这两种算法的唯一不同的是他们开始从不同的地方搜索。
- Material Design Animation - Jobs allocation First Fit & Best Fit
- What are the first fit, next fit and best fit algorithms for memory management?
想象一下这种情况。你一开始就有'n''免费块。您分配一个区块,然后分配一个区块,然后释放第一个区块。你重复这个'n/2'的时间,所以在这个过程结束时你将有'n/2'块分配和'n/2'空闲。随着下一个适合你会让他们交替,首先适合,堆的后半部分将是完全空的。 – biziclop
当然,硬币的另一面是,首先适合你在这个过程中不得不检查大约n^2/4个块,而下一个只适合'n'。 – biziclop