我目前在模拟器中运行我的应用程序时正在查看 Monotouch 内存分析器的输出。我可以看到这些数字:
Object count: 154.043
Total memory: 5.099.648 bytes
“总内存”是否意味着我占用了大约 5MB 的 RAM?Instruments 向我显示分配了大约 30MB,这就是我要问的原因。
我目前在模拟器中运行我的应用程序时正在查看 Monotouch 内存分析器的输出。我可以看到这些数字:
Object count: 154.043
Total memory: 5.099.648 bytes
“总内存”是否意味着我占用了大约 5MB 的 RAM?Instruments 向我显示分配了大约 30MB,这就是我要问的原因。
Total memory
是所有托管对象使用的内存量。分析器只是将每个对象使用的内存相加。
这不是进程中使用的内存总量,原因有两个:
MonoTouch 不会为每个对象分配内存。MonoTouch 以块的形式分配内存,当一个新对象被创建时,它通常会被分配已经分配的内存。在任何情况下,这通常是您可以忽略分析器报告的总内存与您的应用程序使用的实际内存量之间的差异(这不是使用的 5MB 托管内存和 30MB 仪器报告之间存在差异的原因)。
MonoTouch(以及它的分析器)不知道本机代码分配的任何内存。例如,如果您创建一个 UIImage,则图像数据完全保存在本机代码中,并且不会显示在我们的分析器中(您将在分析器中看到 UIImage 实例,但每个使用的内存将是使用的托管内存,其中不包括图像数据)。另一个例子是,如果您从 xib 加载视图:如果您不以某种方式从托管代码访问对象树,则不会为树中的任何对象创建托管对象,并且托管中不会显示任何内容探查器。这是托管分析器的 5MB 和 30MB 仪器报告之间的真正区别。
还要记住,MonoTouch 本身在模拟器中将使用比在设备上更多的内存,因为在模拟器上它被调整为快速编译(以使调试尽可能快),而在设备上它被调整为更好的运行时性能。