在程序开始执行的时候,堆区就是一个连续的空闲空间单元。随着这个程序分配和回收存储工作的进行,空间被分割成若干空闲存储块和已用存储块,而空闲块不一定位于堆区的某个连续区域中。我们将空闲存储块称为“窗口”(hole)。对于每个分配请求,存储管理器必须将请求的存储块放入一个足够大的“窗口”中。除非找到一个大小恰好相等的“窗口”,否则我们必定会切分某个窗口,结果创建出更小的窗口。
对于每个回收请求,被释放的存储块被放回到空闲空间的缓冲池中。我们把连续的窗口接合(coalesce)成为更大的窗口,否则窗口只会越变越小。如果我们不小心,空闲存储最终会变成碎片,即大量的细小且不连续的窗口。此时,就有可能找不到一个足够大的“窗口”来满足某个将来的请求,尽管总的空闲空间可能仍然充足。
网友评论