演练 - 使用 Apple Instruments 工具
本文介绍如何使用 Apple 的 Instruments 工具诊断通过 Xamarin 生成的 iOS 应用程序的内存问题。 它演示了如何启动 Instruments、拍摄堆快照和分析内存增长情况。 此外,还演示了如何使用 Instruments 显示和确定造成内存问题的确切代码行。
本页演示如何使用 Xcode 的 Instruments 工具诊断 iOS 应用程序中的内存问题。
诊断内存问题
在 Visual Studio for Mac 中,通过“工具”>“启动检测”菜单项启动“检测”。
通过选择“运行”>“上传到设备”菜单项,将应用程序上传到设备。
选择“分配”模板(带白色边框的橙色图标)
在窗口顶部的“选择分析模板的对象:”列表中,选择“Memory Demo”应用程序。 首先单击 iOS 设备,展开显示已安装应用程序的菜单。
按“选择”按钮(窗口右下方),启动“Instruments”。 此模板会在顶部窗格中显示两项:分配和 VM 跟踪程序。
按 Instruments 中的“录制”按钮(左上方的红色圈),启动应用程序。
在顶部窗格中选择“VM 跟踪程序”行(应用运行后,会包含两个部分:脏大小和驻留大小)。 在“检查器”窗格中,选择“显示显示设置”选项(齿轮图标),然后选中“自动快照”复选框,如右下方屏幕截图所示:
在顶部窗格中选择“分配”行(应用运行后,会显示“所有堆和匿名 VM”)
在“检查器”窗格中,选择“显示显示设置”选项(齿轮图标),然后单击“标记生成”按钮生成基线。 窗口顶部的时间线中会出现红色小标记
滚动应用程序,然后再次选择“标记生成”(重复几次)
单击“停止”按钮。
展开具有最大“增长”的“生成”节点,并按“增长”排序(降序)。
将“检查器”窗格更改为“显示扩展详细信息”(E),显示“堆栈跟踪”。
请注意,<非对象>节点会显示过多的内存增长。 单击此节点旁边的箭头,查看更多详细信息 - 右键单击堆栈跟踪,将“源位置”添加到窗格中:
按“大小”进行排序,并显示“扩展详细信息”视图:
单击调用堆栈中的相应条目,查看相关代码:
此情况下,会创建新的映像,并将其存储在每个单元格的集合中,而不是重新使用现有集合视图单元格。
解决内存问题
可通过 Instruments 解决这些问题并重新运行应用程序。
通过在类级别声明单个实例,可重复使用映像,并可从现有池中重复使用单元格对象,而无需每次进行创建,如下所示:
public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
// Dequeue a cell from the reuse pool
var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
// Reuse the image declared at the class level
imageCell.ImageView.Image = image;
return imageCell;
}
现在,运行应用程序时,内存使用率会大幅降低 - 此时生成之间的“增长”按 Kib(千字节)测量,而在代码修复前则是 MiB(兆字节):
若要了解如何处理 Xamarin.iOS 方面的内存问题,可参考 Xamarin.iOS 垃圾回收这篇文章。
总结
本文演示如何使用 Instruments 诊断内存问题。 其中介绍了如何从 Visual Studio for Mac 内启动 Instruments,加载内存分配模板,并介绍了如何分步使用快照来确定内存问题。 最后,重新检查了应用程序,验证问题是否已纠正。