65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual Studio 开发的 Xamarin.Android 应用程序的内存使用诊断

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.27/5 (3投票s)

2014年7月18日

CPOL

7分钟阅读

viewsIcon

44061

downloadIcon

1

使用 Visual Studio 开发的 Xamarin.Android 应用程序的内存使用诊断

引言

我最近需要诊断一个使用 Xamarin.Android 和 Visual Studio 开发的 Android 应用程序的内存使用情况。该应用程序不断抛出“内存不足”异常。似乎没有模式可以说明这些异常是如何由应用程序创建的,并且重现它们需要几个步骤,这使得隔离错误原因的工作变得非常困难。

为了更好地了解发生了什么,我使用了 Android 调试监视器工具。这是一个作为 Android SDK 的一部分安装的工具。您将在以下文件夹中找到它(具体取决于您的 Windows 版本)。

C:\Users\<username>\AppData\Local\Android\android-sdk\tools\monitor.bat

本文将描述如何使用此工具诊断 Xamarin.Android 应用程序中的内存使用情况。尽管本文是针对 Visual Studio 和 C# 编写的,但它也适用于 Eclipse 和 Java。

背景

Android 应用程序天生就是要运行在低功耗、低内存设备上,包括智能手机和平板电脑。因此,内存是一种宝贵的资源,因为它相对稀缺(与更高配置的台式电脑或笔记本电脑相比)。

详细描述 Android(或更具体地说,Android 的 Dalvik 虚拟机)如何管理内存超出了本文的范围。只需说内存以一种高效的方式进行管理,考虑到它与更高配置的台式电脑和笔记本电脑相比相对稀缺。

Microsoft.NET Framework 类似,Android 有一个集成的垃圾收集器,其工作方式大致相同,即在不再需要时释放内存。例如,当您的应用程序关闭时,它会被推到应用程序堆栈上(一个当前运行的应用程序列表,其中一个在前台,所有其他应用程序都在后台)。发生这种情况时,Android 认为当前分配给您的应用程序的资源可供前台应用程序使用。因此,您的应用程序使用的任何内存都将重新分配给前台应用程序。这可能有一些例外(例如,如果您的应用程序当前正在处理后台服务),但 broadly speaking,后台应用程序会将其资源释放给前台应用程序。

出于本文的目的,假定您已安装 Android SDK。本文中使用的 Android 调试监视器版本是 22.3.0。

启动 Android 调试监视器工具

导航到您的 Android SDK 文件夹(其位置如上所述),然后双击 monitor.bat 文件。

为了方便起见,您可以将 Android 调试监视器工具添加到您的 Visual Studio IDE 中。如果您之前没有这样做过,请导航到您的工具菜单,然后单击外部工具...菜单选项。

android debug tool

假设您的设备已正确配置 Visual Studio,那么您应该会看到如上所示的 Android 调试监视器工具。

Android 调试监视器工具

从上面的截图中可以看出,左侧是您可能希望监控内存使用的已连接设备列表。右侧是一系列选项卡,每个选项卡显示应用程序资源(如内存和线程)的不同视图。

在屏幕的右上角,您将看到两个用于查看系统资源的按钮。DDMS(Dalvik 调试监视器服务器)和 Hierarchy View。出于本文的目的,我将重点关注 DDMS 视图。

DDMS

Android 附带一个名为 DDMS 的调试工具。它提供与内存、堆、线程、进程等相关的信息。它还可以提供屏幕捕获和日志记录服务。将 DDMS 视为 Android 调试监视器的一个集成组件。

探索 Android 调试监视器

首先从设备选项卡左侧窗格中选择您希望监视的设备。

系统信息

此选项卡概述了设备系统资源(即内存和 CPU)的使用情况。它以简单的饼图显示此信息。

单击右侧窗格中的系统信息选项卡。您将看到此窗格中显示一个下拉列表。

android debug tool

  • 内存使用 - 让您了解哪些进程正在消耗 Android 设备上的内存
  • CPU 负载 - 让您了解这些进程如何消耗 Android 设备上的 CPU

内存使用

android debug tool

CPU 负载

android debug tool

要更新内存使用CPU 负载窗格中显示的信息,您需要单击从设备更新按钮。

Heap

此选项卡概述了设备堆内存的使用情况,即分配给运行应用程序的内存。

在您要监控的设备左侧有一个箭头。您可能需要先单击列表中的设备名称。单击箭头,这将为您提供设备上当前正在运行的应用程序列表。选择您要监控的应用程序。当您选择一个应用程序时,其上方的图标将变为可用。

android debug tool

单击更新堆图标以查看堆信息。这是类似于绿色桶的图标。这样做会用堆数据填充选项卡,如以下屏幕截图所示。

android debug tool

此选项卡上显示的信息会在您的 Android 设备执行的每个 GC(垃圾回收)操作后更新,因此是实时更新的。

窗格在顶部显示摘要信息,底部显示更详细的信息。

就我自己的调试目的而言,我发现顶部的摘要信息已经足够了。这显示了以下有用的信息。

  • 堆大小(MB)
  • 已分配堆大小(MB)
  • 空闲堆大小(MB)
  • 使用百分比
  • 对象数量

当我测试我的应用程序并监控这些堆值时,我能够识别出需要调查的应用程序区域。正如已经提到的,这些值在每次垃圾回收后实时更新。

单击列表中的堆类型会显示相关分配计数按大小的详细图表。

android debug tool

分配跟踪

此选项卡提供更详细的内存信息,让您可以分析(跟踪)内存的分配位置以及分配给谁。

android debug tool

此信息有助于缩小内存问题,因为它允许您查看应用程序在哪里分配内存。

单击分配以查看导致分配的堆栈跟踪。这提供了有关分配的对象类型、线程、类以及在哪一个文件中的详细信息。

单击开始跟踪按钮,然后单击获取分配按钮以监控内存分配。

android debug tool

线程

此选项卡显示有关应用程序线程的信息。

要显示线程信息,请单击您要监控的应用程序,就像我们之前所做的那样。然后单击更新线程图标。

android debug tool

单击单个线程会为您提供生成该线程的堆栈跟踪。

android debug tool

文件浏览器

此选项卡显示您的设备的文件/目录结构,类似于 Windows 资源管理器。

android debug tool

屏幕截图

如果出于任何原因您需要从应用程序的某个屏幕进行屏幕截图,那么 Android 调试监视器就包含这样的功能。在下面的屏幕截图中,它是最右边的图标。

android debug tool

单击此图标会创建屏幕截图。这对于应用程序文档非常有用,或者如果您的测试人员需要一种方法来记录他们创建缺陷所采取的步骤。

android debug tool

这些屏幕截图图像会保存到您的配置文件的 temp 文件夹中。将鼠标悬停在选项卡中的名称上会显示完整的路径和文件名。

摘要

这个有用的小工具可以为您提供大量有关 Android 应用程序系统资源的信息。非常值得花时间进一步探索此工具,以了解它还提供了哪些其他功能。希望本文能给您一个开始。如果您希望我进一步阐述本文中的任何内容,请随时发表评论。

© . All rights reserved.