Xcode Memory Graph - 显示内存使用量增加 - 它到底显示了啥?

Posted

技术标签:

【中文标题】Xcode Memory Graph - 显示内存使用量增加 - 它到底显示了啥?【英文标题】:Xcode Memory Graph - showing increasing memory use - what exactly does it show?Xcode Memory Graph - 显示内存使用量增加 - 它到底显示了什么? 【发布时间】:2014-10-09 08:07:49 【问题描述】:

在 xcode 6(也可能是 5)中查看调试图时,在运行我的应用程序时,内存使用量继续上升,因为我在屏幕上放置了更多特定对象并为其运动设置动画。当我删除它时,它似乎没有减少。删除后,我相信不再有对它们的引用。

看截图: http://i.stack.imgur.com/SnhbK.png

但是,当我使用 Instruments 尝试确定发生了什么时,只有大约 12mb 的持续存在,并且总字节继续增加,正如预期的那样。

看截图: http://i.stack.imgur.com/VBwce.png

这是正常行为吗? Xcode 中的图表到底显示了什么?我忽略了什么吗?

在 Instruments 中,我将 Allocation Lifespan 设置为 All Allocations,Allocation Type 设置为 All Heap and Anonymous VM,以获取上面的屏幕截图。

更新

通过使用 Activity Monitor 运行 Instruments,我可以看到“真实内存”的增长速度与 Xcode 中显示的速度相同。 @Mark Szymczyk 指出,OpenGL ES 纹理内存分配未显示在分配工具中。

通过在 Cocos2D 3.1 中使用以下命令定期清除纹理缓存,内存使用量持续下降到 18mb 左右,并随着我添加更多精灵而再次增加。

[[CCDirector sharedDirector] purgeCachedData];

感谢 Mark Szymczyk 为我指明了这个方向 - 谢谢!

【问题讨论】:

嗨 JoGoFo,您是否在项目中启用了 Zombie? 嗨,学生,我的意思是说 Zombie 已关闭。还有其他想法吗? 您好,您在项目中使用了大量图片吗? 图片数量不多,没有。不到 10 个。我更想知道我是否正确看待这个问题,或者我是否遗漏了什么 【参考方案1】:

查看您的屏幕截图,Xcode 图表可能显示相当于您的 Instruments 屏幕截图中的 Total Bytes 列。当您删除一个对象时,持久字节数会减少,但总字节数不会。这可以解释为什么 Xcode 图表中的内存使用量永远不会下降。

Instruments 中的 Persistent Bytes 列是您应该查看以确定应用程序的内存使用情况。

【讨论】:

谢谢马克。这是我收集到的,但是有人能够确认这是 Xcode 图表所显示的吗?我还想知道 Xcode 是否可能显示分配的内存块,也许我有某种碎片问题? 分配工具不记录 OpenGL ES 纹理分配。 Xcode 的内存图可能会显示分配工具不会显示的纹理内存分配。 谢谢马克,这正是问题所在。定期清除我的纹理缓存可以解决此问题。我会用更多细节更新我的问题并接受您的回答 - 再次感谢! @MarkSzymczyk 我认为说 Xcode 仪表图显示总字节数是不正确的。我无法找到官方文档,但该值几乎总是与 Activity Monitor 的当前总内存列中看到的值相匹配。指出 Instruments 不显示 OpenGL ES 纹理这一事实听起来是一个更合理的正确答案。但现在我认为这个答案具有误导性。

以上是关于Xcode Memory Graph - 显示内存使用量增加 - 它到底显示了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode8调试黑科技:Memory Graph实战解决闭包引用循环问题

xcode5中调试时,CPU与Memory是代表啥

Xcode调试之View Memory(查看内存)

Xcode调试之View Memory(查看内存)

《A1 A Distributed In-Memory Graph Database》论文阅读

检测错误及其解决方案 - Xcode 4.2 - Instrument [Memory Leaks]