AutoreleasePoolPage相关问题
来源:6-7 自动释放池相关面试问题

幕布斯4536089
2018-08-17
AutoreleasePoolPage的大小是多少?
假如一个release对象大小超过一页pagesize的大小,又是怎样处理的?
在源码的 static inline void pop(void *token) 方法中,下图中的代码判断page->lessThanHalfFull()时,直接kill掉child,如何理解?是什么原理?
写回答
1回答
-
于海
2018-08-17
1. AutoreleasepoolPage的大小非官方数据表明大概是1024字节
2. 每个对象存储到page里都是指针 ,不存在你说的一个对象大小超过一个page的这种情况
3. 看源码截图里面的注释可以推测出,在pop的时候,如果当前节点剩余空间少于一半kill掉child意味着page的内存释放。如果剩余空间超过一半不做kill child处理 可以避免下次当前page空间不够用重新挂child节点的操作。
另,
系统很多关于内存扩充的方案都是类似bucket思路。当前page也好array也好 在分配空间的时候 如果当前剩余空间不足三分之一则新增节点挂载上去 那么反之在释放空间的时候,如果释放之后当前剩余空间少于三分之二则释放掉挂载的多余节点 ,这里的1/3 2/3 1/2是具体实现定的值不同罢了00
相似问题