Android Studio Memory Profile 的使用

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 或更高版本的设备上。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Android Studio提供了多个工具来帮助开发者进行性能分析和优化。其中包括CPU ProfilerMemory Profiler。 CPU Profiler可以帮助开发者分析应用程序在CPU使用方面的性能问题。它可以显示应用程序中各个线程的CPU使用情况,包括一些由Android StudioAndroid平台添加的线程,如JDWP、Profile Saver、Studio:VMStats、Studio:Perfa和Studio:Heartbeat。通过CPU Profiler,开发者可以轻松识别出线程活动和CPU使用实际上是由应用程序代码引起的。要打开CPU Profiler,可以点击Android Studio的菜单栏中的View -> Tool Windows -> Android Profiler,然后选择要配置的设备和应用程序进程,最后点击CPU时间轴中的任意位置打开CPU Profiler。\[1\]\[2\] Memory ProfilerAndroid Profiler的一个组件,它可以帮助开发者识别应用程序中的内存泄漏和内存溢出问题。它可以实时显示应用程序的内存使用情况,并提供了捕获堆转储、强制垃圾收集和跟踪内存分配等功能。要启动Memory Profiler,可以点击Android Studio的菜单栏中的View -> Tool Windows -> Android Profiler,然后选择要配置的设备和应用程序进程,最后点击Memory Profile选项卡即可。\[3\] 通过使用这些Profiler工具,开发者可以更好地了解应用程序的性能状况,并进行相应的优化和调试。 #### 引用[.reference_title] - *1* *2* [Android studioandroid profile(性能分析器)的使用(转载)](https://blog.csdn.net/u010259833/article/details/104441812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Android Studio Memory Profile使用](https://blog.csdn.net/hello_1995/article/details/120069424)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ByteSaid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值