支离破碎的堆中包含有许多的自由块(即:没有使用的存储区域),但这些自由块一般都比较小,而且是不相邻的。为了说明这个问题,看看下面的图解。这个图解代表了系统中的一个堆:0表示是自由块,1表示是分配块(即:使用中的存储区域)。
100101010000101010110
虽然,上述堆中总共有12个自由块,但是,如果试着从这个有太多碎片的堆中分配出5个单位的自由块(即:5个0),肯定会失败的。另外,下面的一个堆中自由块虽然比上面的少,但是它却没有碎片:
1111111111000000
想要避免支离破碎的堆,就要尽量少用动态分配内存。在大多数情况下,使用静态存储或自动存储。试着每次分配一个较大的内存块,而不是较小的内存块。例如:要一次性分配一批对象,而不要只是分配单一的对象,然后只要在需要时使用它们即可。
如果上述的办法都不能解决内存碎片问题,你就应当考虑根据你自己的需求,量身打造一个内存池。