为啥仪器中的分配图显示没有增加而标记的代数显示内存增长

Posted

技术标签:

【中文标题】为啥仪器中的分配图显示没有增加而标记的代数显示内存增长【英文标题】:Why does allocations graph in instruments show no increase yet marked generations show memory growth为什么仪器中的分配图显示没有增加而标记的代数显示内存增长 【发布时间】:2014-04-13 20:17:25 【问题描述】:

我正在测试分配工具中的内存问题,但似乎有些奇怪。以蓝色显示的分配图没有显示增加(即使您可以看到几乎没有减少 - 查看红色标记),但您可以看到生成快照中的内存增长。为什么不一致?

【问题讨论】:

你们几代人增长了 87-123kb,但这在分配图表上是难以分辨的,其峰值看起来一定是 15mb 左右。 我也是这么想的,但是区域高度似乎在减少。我想知道我是否做错了什么以及是否加了这些尖峰(它不应该,分配寿命设置为已创建并且仍然存在)。如果您在下面发布,我会接受您的回答。我只需要假设图表并不完美 每一代都做了哪些操作? 我正在生成一堆 SKSpriteNode 对象(以及它们的一些子类),在每个标记生成单击之前移动它们(动画),从 SKScene 中删除所有内容。它应该释放所有内存,但显然没有 【参考方案1】:

    您的世代增长了 87-123kb,但这在分配图表上是难以分辨的,其峰值看起来一定是 15mb 左右。

    如果您查看那些标记您的世代的山谷,看起来它们较低,但如果您在照片编辑工具中仔细查看图像(画一条水平线),它们真的不是。

    即使它们较低,生成工具也会向您显示已分配但未释放的项目。它也没有消除我们在此过程中释放的那些项目。

    看看 C 代,在这种情况下确实要低得多,但“增长”只是向我们展示了在 B 代和 C 代之间分配但未释放的对象。

【讨论】:

难怪增长永远不会是负数,顺便问一下,你是怎么知道这一点的,有什么好的参考资料可以更详细地解释 Instrument 吗? WWDC 视频非常有用。例如。 WWDC 2013 Fixing Memory Issues。或WWDC 2012 ios Performance: Memory。或者,如果您想超越内存问题,可以使用 Building Concurrent User Interfaces 之类的视频。最重要的是,许多关于各种主题的 WWDC 视频都有很好的实用工具演示。

以上是关于为啥仪器中的分配图显示没有增加而标记的代数显示内存增长的主要内容,如果未能解决你的问题,请参考以下文章

内存不足,仪器分配

AVCaptureSession 废弃内存 - 分配 - 仪器

为啥 jeprof 评估的 jemalloc 内存配置文件似乎显示了所有内存分配?

CFString 的内存问题

iOS 的分配工具:比较两个快照的内存

使用仪器收到内存警告