读博客总结:
https://yq.aliyun.com/articles/3065
nano 与 tiny 的不同之处:
- nano 的 bands 是在一段连续的内存, tiny 的 regions 不在连续的区域
- nano 分配的对象内存比较小,也只有16种大小,而 tiny 有64种大小,范围比较大
- 一个 app 启动,大部分的分配都是落在 nano 的范围里的,所以 nano 非常频繁,而且基本不用担心哪种 slot 利用率低的
所以,它们的设计上有这些不同之处:
1. band 中每个 slot 所占的位置和大小都是固定的,region 中没有 slot 的概念,你需要多少我就按照粒度分配多少:
这主要是因为 nano 不担心浪费,因为大部分 malloc 都是需要小内存,利用率非常高,而且也不在乎浪费,反正小嘛,但 tiny 就不同了,本身需要 tiny 的对象就不太多,如果按照 nano 的分配方式就会有可能出现较多的浪费,浪费的代价也大。
比如有个对象需要256B,而且这个对象很多,如果按照 nano 的方式,就需要申请很多个 band,但 band 中的其他 slot 却都空闲着。
2. 因为 region 的分配不是固定的,所以需要 bitmap 去表示 region 的分配情况,而 band 中不需要
3. tiny 的 freelist,如果找不到对应 slot 的,就会去找大一个码的slot,再找不到再大一个码
4. 当一个 region 都被释放时,会被还给系统,而 tiny 从来不还,因为 tiny 的利用率很高的,极大可能一会儿还要用,而且内存又小,而且还是连续的区域,根本就没法还,而 tiny 的有可能只是某一段时间需要的比较多,导致 tiny 的 region 比较多,而且反正是不连续的,还了之后一会儿再要影响也不大,要是占着内存不放,导致内存不足,问题反而严重
5. 当一个 region 中释放了的空间多于某个阈值,就移动到备用 magazine 中(我觉得这里的意思应该是会先把 region 中剩余的东西移动到其他地方),这是在防止空间碎片化,nano 就不需要这样了
它们还有这些相似之处:
1. 对于已经分配过的内存都是挂在 freelist 中,以 slot 为组织单位
2. 但是以16字节为粒度