Xcode Allocations点击Mark Generation后内存增长值下降原因及取值参考
Allocations工具Mark Generation内存增量波动问题
问题描述
使用Allocations工具对App做内存性能分析排查内存问题时,每次点击「Mark Generation」会生成新的内存快照,支持查看两代快照之间的内存增量。但实际测试中发现,点击后生成的增长值总会在数秒内持续下降直至稳定:部分场景初始增长值可达20MB以上,最终却会降至仅几百KB左右,无法确认该现象的成因,也不知道应当采信哪个数值。
操作截图
现象成因
- 初始统计值包含大量短生命周期临时内存:点击Mark Generation瞬间的统计结果,会把操作过程中产生的所有临时对象全部计入增量,包括autorelease池未排空的临时对象、系统框架临时缓存、图片/资源解码的中间缓冲区、函数执行过程中的临时变量等,这类对象本身就不会被长期持有。
- 内存回收存在固有延迟:点击快照的时间点,系统还没完成无引用对象的回收流程——对iOS/macOS应用来说是自动释放池未到排空时机、引用计数为0的对象还没完成内存释放;对Android/Java类应用来说是GC还未触发扫描回收这部分待清理对象,因此初始值会把这部分待回收的内存全部算入增量。
- 数秒内的数值下降过程,就是系统逐步完成临时对象回收、临时缓存淘汰的过程,等数值不再变动时,剩下的增量才是操作路径上被代码长期持有的内存。
可信数值参考标准
请采信点击Mark Generation后等待5-10秒、数值完全稳定后的最终增量,初始的高增长值不具备长期内存问题排查的参考价值。
补充说明:
- 排查内存泄漏时,点击生成Generation后不要做其他额外操作,等数值稳定后再做判断:如果稳定后的增量仍然维持在较高水平(数MB及以上),再下钻到对象列表排查未被释放的异常持有对象。
- 初始的高增长值仅能反映对应操作的瞬时内存峰值,可用于评估操作过程是否可能触发系统内存警告,不能作为内存泄漏、长期内存增长的判断依据。
内容的提问来源于stack exchange,提问作者P. Tsin
相关产品推荐
相关产品推荐




