iOS Instrumentation:如何解释内存分配模板?

Posted

技术标签:

【中文标题】iOS Instrumentation:如何解释内存分配模板?【英文标题】:iOS Instrumentation: how to interpret Memory Allocations Template? 【发布时间】:2016-10-01 17:16:32 【问题描述】:

我正在为 ios Instrumentation 使用分配分析模板。 我为 UIView 类创建了一个扩展,它为未添加到视图层次结构中的视图拍摄快照。我想仔细检查我的新方法消耗了多少内存。 我发现我的新方法从堆中分配了 288 个字节,如下图所示。

然后我导航到相应的方法,我发现内存量如预期的那样大。看看下面的图片。

我的问题是:

    为什么我在堆中看不到这些巨大的数字? 这么大的内存是从哪里分配的? 是否有反映此拥抱数字的特定详细视图(调用树除外)?

请注意,我并不是在询问拍摄快照的最佳方式是什么。我已经熟悉Apple method snapshotView。我做这个练习只是为了测试我对 iOS 中内存使用的理解。

【问题讨论】:

【参考方案1】:

一些想法:

    过滤调用树的结果时要小心。您可能不小心删掉了分析器与内存关联的例程。尝试(a)选择具有问题分配的图形范围(以减少结果中的噪声量); (b) 移除过滤器,然后 (c) 在您看到大内存跳跃的那一点展开树:

    就个人而言,我经常发现翻转调用树和隐藏系统库更容易:

    或者,你也可以去“Allocations”的“Statistics”找到大的分配:

    然后您可以深入了解:

    然后通过点击右侧的“Extended Detail”面板,跳转到有问题的代码:

    如果您愿意,另一种在 Xcode 8 中查找分配的方法是在您的方案中打开“Malloc Stack”选项,然后使用 https://***.com/a/30993476/1271826 中所述的“Debug Memory Graph”选项。

    例如,我使用了“Debug Memory Graph”,找到了 CG Raster Data,我可以看到这个 10mb 图像的对象图,以及在“Extended Details”中看到分配的堆栈右侧面板:

【讨论】:

感谢 Rob 的回答,但我不确定如何将您的回答与我的 3 个相关问题联系起来? 您的第一个问题是“为什么我在调用树中看不到分配”,我的回答是“(a)不要像你那样过滤调用树;和(b)确保围绕相关分配选择范围”。您的第二个问题是“这么大的分配来自哪里”,没有人可以为您回答,没有向您展示识别分配的不同方法(我向您展示了三种不同的方法来实现这一点)。您的第三个问题是还有哪些其他机制可用于查找分配,我再次向您展示了许多替代方案。我不知道我还能做什么。 感谢 Rob 的回答,但是没有任何过滤器就不会出现巨大的内存,因此您对 a 的回答对我没有帮助。至于b,你没有回答。最后对于 c,我真的很感谢你的重要选择,但没有一个能透露出这个巨大的记忆。因此,我将等待社区中任何其他可能帮助我回答这些问题的意见。再次感谢。

以上是关于iOS Instrumentation:如何解释内存分配模板?的主要内容,如果未能解决你的问题,请参考以下文章

太白---落燕纷飞第一重 Android单元測试Instrumentation和irobotium

系统服务Windows Management Instrumentation如何修复

如何在 asm 代码中正确使用 Instrumentation.retransformClasses()?

测开面试 | 自动化测试之工具篇

Pin Binary Instrumentation:如何精确识别函数名称。

Android:如何将 Instrumentation APK 安装到无头主机中的 AVD 上