【问题标题】:Understanding Instruments and the All Heap & Anonymous VM了解 Instruments 以及所有堆和匿名 VM
【发布时间】:2016-05-03 08:40:27
【问题描述】:

我正在尝试了解 Instruments / Allocation 中的“所有堆和匿名 VM”。

事情是这样的:我只是创建了一个新的 Swift SpriteKit 项目,没有做任何事情我得到了下一个结果:

如您所见,堆正在增长。不过我没有内存泄漏。我该如何解释呢?这是一个好结果吗?

【问题讨论】:

  • 没问题,直到您的设备没有一次又一次地抛出内存警告有您正在使用的 serval 系统库,所以有很多 malloc() 或 calloc() 调用。其次,在弧下,您不必担心堆和分配。当您从一个 SKScene 移动到另一个或一个视图到另一个视图时,arc 会自动释放内存(直到您没有任何强引用)SKScene 和 All Heap & Anonymous VM 会自动减少。

标签: memory-management memory-leaks xcode7 instruments allocation


【解决方案1】:

关注所有堆分配的 Live Bytes 列,以查看您的应用程序正在使用多少内存。您无法控制应用程序的匿名 VM 大小。

关注堆分配,因为您的应用可以更好地控制 堆分配。 您的应用进行的大部分内存分配是 堆分配。

匿名VM中的VM代表虚拟内存。 当您的应用程序启动时,操作系统会保留一块 应用程序的虚拟内存。这个块通常要大得多 超过您的应用程序所需的内存量。当您的应用分配 内存,操作系统从它的块中分配内存 保留。

记住上一段中的第二句话。经营的 系统决定了虚拟内存块的大小,而不是你的应用程序。 这就是为什么你应该关注堆分配而不是 匿名虚拟机。 您的应用无法控制匿名的大小 虚拟机。

来源:http://meandmark.com/blog/2014/01/instruments-heap-allocations-and-anonymous-vm/

【讨论】:

  • Your app has no control over the size of the anonymous VM。并非如此,如果您使用任何图形 API,例如 OpenGLMetal,您可以控制驱动程序应该分配多少 vertexbuffer
  • 我认为匿名 VM 是应用程序分配的内存,但不是通过 malloc() 分配的,所以不在堆中。例如,当应用程序向内核请求内存页面时,这不是由堆管理的,而是显示为“匿名”的。一些框架有自己的内存管理(他们自己的堆)并且不使用主堆。在 Instrument 中,您可以准确地看到有多少分配是匿名的,以及分配发生在源代码的哪个位置。上面的答案似乎是错误的。
【解决方案2】:

分配信息不包括 VRAM(Video Memory) 的使用,因此它不会显示 APP 内存的完成状态,Xcode 内存报告会显示。

如果您使用图形渲染 API,内存的增长速度会比您想象的要快得多。 OpenGL/Metal 对象的大小是由图形 API 在 VRAM 中创建的,将计入 APP 内存使用。

许多 OpenGL 指令会将数据从 RAM 复制到 VRAM 以供 GPU 使用。

例如,如果您创建许多纹理并为其设置图像数据。堆分配比 VARM 分配少得多。

提醒MemoryWarning 会在使用过多的 RAM 和 VRAM 时收到。

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2013-08-31
    • 2021-08-08
    • 2010-12-16
    相关资源
    最近更新 更多