1 Memory Profile 简介

Memory Profiler 是 Android Profiler 中的一个组件,它可以帮助你识别内存泄漏和内存溢出,从而导致存根、冻结甚至应用程序崩溃。它显示了应用程序内存使用的实时图,让你捕获堆转储、强制垃圾收集和跟踪内存分配。

2 Memory Profile 启动

如需打开 Memory Profile,请按以下步骤操作:

  1. 依次点击 View > Tool Windows > Profiler,也可以点击工具栏中的 Profile 图标。
    ndroid-profiler

  2. 从 Android Profiler 工具栏中选择要分析的设备和应用进程。如果已通过 USB 连接设备但系统未列出该设备,请确保已 启用 USB 调试

  3. 点击 MEMORY 时间轴上的任意位置以打开内存性能分析器。
    memory-profiler-callouts

如图所示,内存性能分析器的默认视图包括以下各项:

  1. 用于强制执行垃圾回收事件的按钮。
  2. 用于 捕获堆转储 的按钮。注意:只有在连接到搭载 Android 7.1(API 级别 25)或更低版本的设备时,系统才会在堆转储按钮右侧显示用于 记录内存分配情况 的按钮。
  3. 用于指定性能分析器多久捕获一次内存分配的下拉菜单。选择适当的选项可帮助你 在进行性能剖析时提高应用性能
  4. 用于缩放时间轴的按钮。
  5. 用于跳转到实时内存数据的按钮。
  6. 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。
  7. 内存使用量时间轴,会显示以下内容:
  • 一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示。
  • 一条虚线,表示分配的对象数,如右侧的 y 轴所示。
  • 每个垃圾回收事件的图标。

但是,如果使用的是搭载 Android 7.1 或更低版本的设备,并非所有分析数据在默认情况下都可见。如果提示“Advanced profiling is unavailable for the selected process”,需要 启用高级性能剖析 才能看到以下内容:

  • 事件时间轴
  • 分配的对象数
  • 垃圾回收事件

在 Android 8.0 及更高版本上,系统会一律为可调试的应用启用高级性能剖析。

内存占用中的类别如下:

  • Java :从 Java 或 Kotlin 代码分配的对象的内存。
  • Native :从 C 或 C++ 代码分配的对象的内存。即使应用中不使用 C++,也可能会看到此处使用了一些原生内存,因为即使编写的代码采用 Java 或 Kotlin 语言,Android 框架仍使用原生内存代表处理各种任务,如处理图像资源和其他图形。
  • Graphics :图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存。(请注意,这是与 CPU 共享的内存,不是 GPU 专用内存。)
  • Stack :应用中的原生堆栈和 Java 堆栈使用的内存。这通常与应用运行多少线程有关。
  • Code :应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存。
  • Others :应用使用的系统不确定如何分类的内存。
  • Allocated :应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象。如果连接到搭载 Android 7.1 及更低版本的设备,只有在 Memory Profile 连接到运行的应用时,才开始此分配计数。因此,开始分析之前分配的任何对象都不会被计入。但是,Android 8.0 及更高版本附带一个设备内置性能剖析工具,该工具可跟踪所有分配,因此,在 Android 8.0 及更高版本上,此数字始终表示应用中待处理的 Java 对象总数。

与以前的 Android Monitor 工具中的内存占用相比,新的 Memory Profile 以不同的方式记录内存占用,因此内存使用量现在看上去可能会更高些。Memory Profile 会监控一些额外的类别,这就增加了总的内存使用量,但“Java”占用与以前工具中的数值相似。

3 查看内存分配情况

内存分配情况图表显示内存中每个 Java 对象和 JNI 引用的分配方式。具体而言,Memory Profile 显示有关对象分配情况的以下信息:

  • 分配了哪些类型的对象以及它们使用多少空间。
  • 每个分配的堆栈轨迹,包括在哪个线程中。
  • 对象在何时被取消分配(仅当使用搭载 Android 8.0 或更高版本的设备时)。

如果设备搭载的是 Android 8.0 或更高版本 ,可以随时查看对象分配,具体操作步骤如下:在时间轴上拖动以选择要查看哪个区域的分配,不需要开始记录会话,因为 Android 8.0 及更高版本附带设备内置分析工具,可持续跟踪您的应用分配。如图所示:

memory-profiler-allocations-jvmti
如果设备搭载的是 Android 7.1 或更低版本 ,请点击内存性能分析器工具栏中的 Record 按钮 。记录时,内存性能分析器会跟踪应用中发生的所有分配。完成后,再次点击按钮以查看分配。

memory-profiler-allocations-record
如需检查分配记录,请按以下步骤操作:

  1. 浏览列表以查找堆计数异常大且可能存在泄漏的对象。为帮助查找已知类,点击 Class Name 列标题以按字母顺序排序。然后,点击一个类名称。此时右侧将出现 Instance View 窗格,显示该类的每个实例。
    此外,您也可以快速找到对象,方法是点击 Filter 图标 profiler_filter
    ,或按 Ctrl+F 键(在 Mac 上,按 Command+F 键),然后在搜索字段中输入类或软件包名称。如果从下拉菜单中选择 Arrange by callstack ,还可以按方法名称搜索。如需使用正则表达式,请勾选 Regex 旁边的复选框。如果您的搜索查询区分大小写,请勾选 Match case 旁边的复选框。
  2. Instance View 窗格中,点击一个实例。此时下方将出现 Call Stack 标签页,显示该实例被分配到何处以及在哪个线程中。
  3. Call Stack 标签页中,右键点击任意行并选择 Jump to Source ,以在编辑器中打开该代码。
    memory-profiler-allocations-detail

在已分配对象列表上方有两个下拉菜单。
从左侧的菜单中,选择需检查的堆:

  • default heap :当系统未指定堆时。
  • image heap :系统启动映像,包含启动期间预加载的类。
  • zygote heap :写时复制堆,其中的应用进程是从 Android 系统中派生的。
  • app heap :应用在其中分配内存的主堆。
  • JNI heap :显示 Java 原生接口 (JNI) 引用被分配和释放到什么位置的堆。

从右侧的菜单中,选择如何安排分配:

  • Arrange by class :根据类名称对所有分配进行分组。这是默认值。
  • Arrange by package :根据软件包名称对所有分配进行分组。
  • Arrange by callstack :将所有分配分组到其对应的调用堆栈。

如果需要查看 Native 层的内存分配,左侧菜单选择 JNI heap ,而且应用需要部署到搭载 Android 8.0 或更高版本的设备上。

Memory Profiler 是 Android Profiler 中的一个组件,它可以帮助你识别内存泄漏和内存溢出,从而导致存根、冻结甚至应用程序崩溃。它显示了应用程序内存使用的实时图,让你捕获堆转储、强制垃圾收集和跟踪内存分配。......
关于性能优化的问题,可能一直有遇到,也一直在解决,但是在中小厂和自我要求一般的场景下,我们很少去实实在在的做性能优化; 在开发中我时不时点一点 Profile r, 一直没去细究,但近期想继续提升一下自己 ~ 故此,我抽时间对 Android Studio 内的 Profile r 总结心得(OS:在看过 官网 对Proiler的文档,我都在怀疑有没有记录此篇Blog的必要,不过最终还是动笔了,当二次自省吧 ~) 基础了解CPU分析内存分析网络分析能耗分析 Profile r 性能分析工具,包含以下.
依次点击 Android Studio 的View → Tool Windows → Android Profile r, 或直接点击工具栏 Android Profile r对应的图标
使用 .NET进行程序开发的时,可能会碰到内存溢出、或者程序运行时内存占用过大。特别是医院的PACS、RIS系统对于图片的操作比较频繁,对于程序内存的控制特别的重要,这时候可以 使用 .NET的内存分析工具ANTS Memory Profile r进行程序的内存分析。         工具下载地址:http://www.red-gate.com/products/  文档地址:http
前言:Unity Memory Profile r主要用来查看托管内存和本机内存的详细分配情况。它通过捕获、检查、比对内存快照的方式来检测 内存泄漏 和内存碎片。本篇文章中 使用 的版本是0.2.10版本。 打开偏好设置:点击【Preferences -> Analysis -> Memory Profile r】菜单项来打开偏好设置。如下图所示: 其中,常用的参数设置如下所示: 1. Memory Snapshot Storage Path:设置保存内存快照文件的相对路径(必须以./或者…/开头)。当路径非
Android Studio 是开发 Android 应用程序的官方IDE,以下是 使用 Android Studio 的步骤: 1. 下载和安装 Android Studio 在官方网站下载 Android Studio ,并按照安装向导的指示安装。 2. 创建新项目 启动 Android Studio ,选择“Start a new Android Studio project”,然后按照向导的指示创建新项目。 3. 配置项目 在项目配置中,您需要选择项目名称、包名、项目位置、最低支持的 Android 版本、目标设备、项目模板和其他设置。 4. 编辑布局 使用 Android Studio 的可视化布局编辑器,您可以创建和编辑应用程序的用户界面。您可以拖放UI元素并编辑其属性。 5. 编写代码 使用 Java或Kotlin编写 Android 应用程序的逻辑代码。您可以 使用 Android Studio 的代码编辑器、自动完成和调试器。 6. 运行应用程序 使用 Android Studio 的模拟器或连接到物理设备来运行和测试应用程序。 7. 调试应用程序 使用 调试器来查找和修复应用程序中的错误。 8. 打包和发布应用程序 使用 Android Studio 的签名工具来打包应用程序,并将其发布到Google Play商店或其他应用程序商店。 以上就是 Android Studio 的基本 使用 步骤。