用仪器分析内存泄漏 – iPhone 4和iOS 5 Simulator之间的巨大差异

在使用Instruments(寻找内存泄漏)分析我的应用程序时,我使用运行iOS 5的iPhone 4获得的结果与使用iOS 5 iPhone Simulator的结果截然不同。第一张图显示了使用真实设备进行分析的结果,第二个是模拟器:

真实的设备:

真正的设备


iOS 5模拟器:

模拟器

在这两种情况下,此configuration文件在应用程序中都处于相同的位置:在rootViewController的视图生命周期中完成viewDidLoad。 我已经等待了他们的总分配内存稳定。 正如您在设备图表中看到的,在00:10左右会出现一些极端的波动,这在模拟器中是不存在的。 在真实的设备上,00:08左右的总分配内存从1MB跳到3.5 MB,然后跳回到1.5 MB,最后跳到4.74稳定。 为模拟器分配的内存更加线性,稳定并迅速攀升至2.35 MB左右。

另外需要注意的是设备上存在2.25 MB分配的内存,而不是来自malloc的模拟器和CFNumber的700+ KB。 由于我使用仪器和分析相对较新,我不确定这是否正常。 一个快速的谷歌search没有什么明确的。 2.25 MB和700 KB以上弥补了内存分配的差异。 为了平衡,在模拟器testing中存在不同数量的内存的malloc中有更多的项目不存在于设备testing中。

此外,我发现,当第二个UIViewController被推到UINavigationController堆栈上时,分配的内存会跳到真实设备上的大约8.5-9 MB,但在模拟器上只有大约4.5到大约4.5兆字节。

我知道这是预计该设备将执行与模拟器有很大的不同,但内存分配不是很相似,因为相同的代码在两个设备上运行? 我会明白,如果这是一个性能分析,但内存分配,似乎这些数字应该是非常相似的。 谁能说清楚这是否正常?

这种行为是可以预料的。 从技术上讲,当你使用模拟器运行分析时,你正在测量基于桌面硬件的统计数据。 即使你只是分析分配,你也不能期望它们能够以类似的方式工作,因为很多软件优化/algorithm等都是基于它所运行的硬件。

不幸的是,苹果公司没有iOS 模拟器 。 尽pipe如此,你可以更好地分析设备,因为仿真器往往还是不可靠和缓慢(例如Android模拟器)。

你应该总是在iOS设备上运行泄漏,而不是在模拟器上运行。 你从模拟器得到的结果只会作为一个分心,因为他们很less100%准确。 你会发现自己追逐了很多红鲱鱼! 呵呵呵

I know it is to be expected that the device would perform much differently from the Simulator, but should memory allocation not be pretty similar because the same code is being run on both devices? I would understand if this is a performance profiling, but for memory allocation, it seems that the numbers should be pretty similar. Can anyone shed some light as to whether this is normal or not? 

从技术上讲,代码是完全不同的。 模拟器应用程序编译为x86字节码,而设备编译为armv6 / armv7。