图片来自侯捷老师的课程
alloc
(1)分配器分配内存,#0号分配8字节,#1号分配16字节,#2分配24字节,以此类推…
(2)每次分配出20个块来存储数据,再额外分配20个块作为备用池
(3)需要字节不一样时(此时需要64字节),从备用池切割,从20块变为10块来适配64字节大小。
(4)无备用池可用,调用malloc获得内存,Roundup(1280>>4)是追加量,每一次分配都会多一些,设计团队的想法,个人不是很理解,但猜测是为了足够多的备用空间考虑。
(5)88字节的容器可以直接使用备用池,备用池余下240字节,此时共有4个不同大小的容器,调用了两次malloc(两个cookie)
(6)容器申请88个字节空间
(7)分配8字节大小
(8)新的容器申请104字节大小,备用池(80)不满足最小需求,那么为了防止产生内存碎片,此块内存交给#7来处理。
(9)新容器继续申请112字节大小,备用池够用。
(10)新容器申请48字节大小,备用池分出3块,还剩24字节大小。
(11)模拟超出堆空间情况,system heap设为10000。
此时申请72字节的空间必然失败(72* 20 *2),因此向比#8(72byte)大的区号去借空间,发现#9号区块有之前的一块内存碎片(80byte),利用此块空间分出一块72字节空间给容器,还剩8字节的一块备用池,由#8指向此备用池。
(12)接上,继续给容器分配72字节大小
备用池只剩8字节不足分配,此块8字节块作为内存碎片交给#0管理。
向后继续借空间,发现#10区号(88字节)有空闲块,借走72字节空间存放新容器数据(72byte),剩下16字节作为备用池(#8指向此块),#10区块的指针下移一个单位(88字节)。
(13)新申请120字节空间,先找#14区块,没有可用空间,向右找发现#15也没有可用空间,此时山穷水尽了,申请内存失败。
(14)接上,分配失败时,思考两个问题
1.从图中看出还有很多内存块没用到,是否可以利用到? 理论可以,实现极其困难。
2.利用system heap中剩余空间资源(10000-9688=312)? 貌似没有必要,锤死挣扎,不如优雅的死去。