Memory management 我应该使用什么工具来了解我的Monotouch应用程序&x27;内存使用情况如何?

Memory management 我应该使用什么工具来了解我的Monotouch应用程序&x27;内存使用情况如何?,memory-management,xamarin.ios,instruments,Memory Management,Xamarin.ios,Instruments,我读了很多关于跟踪仪器内存使用情况的书,但很少发现Monotouch与之结合 这里似乎有三种说法: 使用工具的分配实用程序。“活动字节数”是应用程序使用的物理内存量 使用内存监视器插件。从进程列表中,选择你的应用程序并检查“真实内存”列。这是当前正在使用的RAM的数量 使用虚拟机跟踪器并制作自动快照。如果你想要的是“脏尺寸” 据我所知: 一旦GC被触发,“真实内存”就会下降 即使我的“活动字节”保持在30MB左右,我最终也会捕获内存警告 在“活动字节”不变的情况下,“真实内存”可以显著增加,并

我读了很多关于跟踪仪器内存使用情况的书,但很少发现Monotouch与之结合

这里似乎有三种说法:

  • 使用工具的分配实用程序。“活动字节数”是应用程序使用的物理内存量
  • 使用内存监视器插件。从进程列表中,选择你的应用程序并检查“真实内存”列。这是当前正在使用的RAM的数量
  • 使用虚拟机跟踪器并制作自动快照。如果你想要的是“脏尺寸”
  • 据我所知:

    • 一旦GC被触发,“真实内存”就会下降
    • 即使我的“活动字节”保持在30MB左右,我最终也会捕获内存警告
    • 在“活动字节”不变的情况下,“真实内存”可以显著增加,并且很容易增长到200MB或更大
    • 当使用QLEVIEWCONTROLLER并查看一个大得惊人的Word文档(1000页)时,滚动该文档将疯狂地增加真实内存。如果收到内存警告,则实际内存和活动字节都不会下降。最终,应用程序将崩溃;单触问题还是苹果的问题
    • 有时候,真实的记忆似乎在增长,没有什么能阻止它。再一次,GC似乎清除了其中的大部分。在这方面没有真正的模式
    那么正确的答案是什么呢?确实有一个吗

    编辑:我附上了两张图片。一个显示内存使用在一个阶段在我的应用程序的生活中的一个和秒一个从后面的方式。这两个图像反映了UI中同一点的内存使用情况,其中屏幕上只有两个控制器。也许有人仍然可以评论那些数字,特别是神奇的“记忆标签70”


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

    这里似乎有三种相反的主张:
    1.使用仪器的*分配*实用程序。“活动字节数”是应用程序使用的物理内存量

    我不知道“活动字节”到底是什么,但它不是应用程序使用的物理内存量。我认为这是所有Objective对象使用的物理内存量(如果这一理论正确,“活动字节”不包含托管代码使用的任何内存,也不包含Objective对象间接使用的任何内存(如图像数据),这似乎是正确的)。如果您想追踪泄漏的对象,“活动字节”肯定很有用,但它(不一定)是实际使用内存量的一个好指标

    二,。使用内存监视器插件。从进程列表中,选择你的应用程序并检查“真实内存”列。这是当前正在使用的RAM的数量

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

    三,。使用虚拟机跟踪器并制作自动快照。如果你想要的是“脏尺寸”

    对。“脏尺寸”是你所追求的——不管它与“真实内存”有多么密切的关系,它只是将“真实内存”分成几个类别,这样你就可以很容易地看到内存在使用什么

    对于由于图像泄漏而使用大量内存的典型情况,处理过程如下:
    1.使用内存监视器验证您的应用程序是否确实存在内存问题。
    2.在VM Tracker/“脏大小”中可以看到图像数据占用了大量内存(这就是神奇的“内存标签70”)。
    3.使用分配查找CGImages的创建位置,查看相应的堆栈跟踪并跟踪这些图像未被释放的原因

    但每个应用程序都是不同的,所以不可能想出一个适用于所有情况的简单方法

    • 一旦GC被触发,“真实内存”就会下降
    • 即使我的“活动字节”保持在30MB左右,我最终也会捕获内存警告
    • 在“活动字节”不变的情况下,“真实内存”可以显著增加,并且很容易增长到200MB或更大
    所有这些都在上面解释过

    • 当使用QLEVIEWCONTROLLER并查看一个大得惊人的Word文档(1000页)时,滚动该文档将疯狂地增加真实内存。如果收到内存警告,则实际内存和活动字节都不会下降。最终,应用程序将崩溃;单触问题还是苹果的问题
    这也可能是你的问题:)如果不知道内存在哪里,就不可能知道

    • 有时候,真实的记忆似乎在增长,没有什么能阻止它。再一次,GC似乎清除了其中的大部分。在这方面没有真正的模式

    你的意思是,当你的应用完全没有做任何事情时,你却在看着真实的内存增长?如果你真的在应用程序中执行某些操作,这是完全正常的。

    关于你对QLPreviewController的评论和实际内存增长:我不知道有什么可以阻止QLPreviewController的内存使用。只需创建一个测试应用程序,并给它一个巨大的文档和滚动,你就会看到真正的内存增长。关于内存增长:我的意思是,有时应用程序在60MB的实际内存下被扼杀,有时在200MB的实际内存下被扼杀。我的感觉是GC有时无法返回未使用的内存,但我无法证明(但:-)。我验证了,我可以看到我50%的脏内存来自“内存标签70”-这是什么?@Krumelur:更新了答案以包括在内