4

我一直在阅读很多关于在 Instrument's 中跟踪内存使用情况的文章,但发现很少与 Monotouch 结合使用。

这里似乎有三个反对的主张:

  1. 使用Instruments的Allocation实用程序。“活动字节”的数量是应用程序使用的物理内存量。
  2. 使用内存监视器插件。从进程列表中,选择您的应用并检查“真实内存”列。这是当前使用的 RAM 量。
  3. 使用VM Tracker并制作自动快照。如果您想要的是“脏大小”。

据我观察:

  • 一旦触发 GC,“Real Memory”就会下降
  • 即使我的“Live Bytes”保持在 30MB 左右,我最终也会收到内存警告
  • 通过恒定的“Live Bytes”,“Real Memory”可以显着增加并轻松增长到 200MB 或更多。
  • 在使用 QLPreviewController 并查看一个非常大的 Word 文档(1000 页)时,滚动浏览该文档会疯狂地增加真实内存。如果收到内存警告,则实际内存和活动字节都不会下降。最终,应用程序会崩溃;Monotouch问题还是Apple的问题?
  • 有时,真实的记忆似乎在增长,没有什么可以阻止它。再说一次,GC 似乎清除了大部分。这没有真正的模式。

那么正确答案是什么?有没有一个?

编辑:我附上了两张图片。一个显示在我的应用程序生命周期中的一个阶段的内存使用情况,以及稍后的几秒钟。两个图像都反映了 UI 中同一点的内存使用情况,屏幕上只有两个控制器。也许有人仍然可以评论从这些数字中可以读出什么,尤其是神奇的“记忆标签 70”。

在此处输入图像描述 在此处输入图像描述

4

1 回答 1

3

Instruments 有点像一个黑匣子,但我认为它是这样的:

这里似乎存在三个相反的主张:
1. 使用 Instruments 的 *Allocation*s 实用程序。“活动字节”的数量是应用程序使用的物理内存量。

我不确切知道“Live Bytes”是什么,但这不是应用程序使用的物理内存量。我认为这是所有 ObjectiveC 对象使用的物理内存量(如果这个理论是正确的,“Live Bytes”不包含托管代码使用的任何内存,也不包含 ObjectiveC 对象(例如图像数据)间接使用的任何内存,其中似乎是真的)。如果您想追踪泄漏的对象,“Live Bytes”绝对有用,但它不是(必然)一个很好的指标,可以指示实际使用了多少内存。

2. 使用内存监视器插件。从进程列表中,选择您的应用并检查“真实内存”列。这是当前使用的 RAM 量。

这有点接近:“Real Mem”是应用程序正在使用的不与其他应用程序共享的物理内存量。应用程序使用的物理内存总量是“Virtual Mem”,但应用程序之间共享了大块“Virtual Mem”(即共享库在加载到内存时当然会使用内存,但由于它是不可变的,它会只为所有进程加载一次。但是它将被添加到每个进程的“虚拟内存”中,因此如果您添加所有进程使用的“虚拟内存”,您将远远超出设备的实际物理内存)。

3. 使用 VM Tracker 并制作自动快照。如果您想要的是“脏大小”。

正确的。“Dirty Size”是您所追求的 - 然而,这与“Real Mem”密切相关,它只是将“Real Mem”分成类别,因此您可以轻松查看正在使用内存的内容。

对于由于泄漏图像而使用大量内存的典型情况,过程如下:
1. 使用内存监视器验证您的应用程序确实存在内存问题。
2. 在 VM Tracker / "Dirty Size" 中看到图像数据使用了大量内存(这就是神奇的 "Memory Tag 70")。
3. 使用 Allocations 找出 CGImage 的创建位置,查看相应的堆栈跟踪并追踪这些图像未释放的原因。

但是,每个应用程序都不同,因此不可能提出适用于所有情况的简短配方。

  • 一旦触发 GC,“Real Memory”就会下降
  • 即使我的“Live Bytes”保持在 30MB 左右,我最终也会收到内存警告
  • 通过恒定的“Live Bytes”,“Real Memory”可以显着增加并轻松增长到 200MB 或更多。

所有这些都在上面解释过。

  • 在使用 QLPreviewController 并查看一个非常大的 Word 文档(1000 页)时,滚动浏览该文档会疯狂地增加真实内存。如果收到内存警告,则实际内存和活动字节都不会下降。最终,应用程序会崩溃;Monotouch问题还是Apple的问题?

这也可能是您的问题:) 如果不知道内存的去向,就无法判断。

  • 有时,真实的记忆似乎在增长,没有什么可以阻止它。再说一次,GC 似乎清除了大部分。这没有真正的模式。

你的意思是当你的应用程序完全没有做任何事情时,你正在观察真实内存的增长?如果你真的在你的应用程序中做某事,这是完全正常的。

于 2012-05-02T10:44:12.917 回答