android studio内存分析之Memory profiler的使用

本文详细介绍了如何在AndroidStudio中使用MemoryProfiler进行内存分析,包括打开方法、工具使用、内存选项说明、性能分析器概览、内存计算方式、捕获和查看内存分配,以及堆转储文件的导入导出和内存泄漏检测步骤。
摘要由CSDN通过智能技术生成

Android Studio中内存分析工具Memory profiler的使用

参考文章

1. 打开Memory Profiler

有两种方式打开,第一种通过标题栏打开:
在这里插入图片描述
第二种通过下方菜单栏打开
在这里插入图片描述

2. 工具使用

打开后是这样的:
在这里插入图片描述
打开后,点击 + 号,选择自己包名
在这里插入图片描述
选择完成后,就会创建你项目的SESSIONS界面:
在这里插入图片描述
如果想删除这个SESSIONS,右键删除:
在这里插入图片描述
点击memory这一列
在这里插入图片描述
点击后到内存捕获类型页面

3. 内存选项说明
  • 捕获堆转储(Capture heap dump):查看应用程序中在特定时间点使用内存的对象
  • 记录Native分配(Record native allocations):查看每个C/C++对象在一段时间内是如何分配的
  • 记录java/kotlin分配(Record java/kotlin allocations):查看在一段时间内如何分配每个java/kotlin对象
    在这里插入图片描述
    然后是这个页面
    在这里插入图片描述
    在这里插入图片描述
    然后看到这个页面
    在这里插入图片描述
    在这里插入图片描述
4. 内存性能分析器概览

原文链接
内存性能分析图
当您首次打开内存性能分析器时,您将看到一条表示应用内存使用量的详细时间轴,并可使用各种工具强制执行垃圾回收、捕获堆转储以及记录内存分配
在这里插入图片描述

  1. 用于强制执行垃圾回收事件的按钮
  2. 用于捕获堆转储的按钮
  3. 用于指定性能分析器多久捕获一次内存分配的下拉菜单
  4. 用于缩放时间轴的按钮
  5. 用于跳转到实时内存数据的按钮
  6. 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件
  7. 内存使用量时间轴,它会显示以下内容
  • 一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示
  • 一条虚线,表示分配的对象数,如右侧的 y 轴所示
  • 每个垃圾回收事件的图标
5. 内存计算方式

内存性能分析器顶部看到的数字
在这里插入图片描述
内存计数中的类别如下

  • Java:从 Java 或 Kotlin 代码分配的对象的内存
  • Native:从 C 或 C++ 代码分配的对象的内存
  • Graphics:图形缓冲区队列为向屏幕显示像素(包括 GL 表面、GL 纹理等等)所使用的内存
  • Stack:您的应用中的原生堆栈和 Java 堆栈使用的内存。这通常与您的应用运行多少线程有关
  • Code:您的应用用于处理代码和资源(如 dex 字节码、经过优化或编译的 dex 代码、.so 库和字体)的内存
  • Others:您的应用使用的系统不确定如何分类的内存
  • Allocated:您的应用分配的 Java/Kotlin 对象数。此数字没有计入 C 或 C++ 中分配的对象
6. 查看内存分配

选择Capture heap dump,并点击Record按钮,开始捕获,捕获完成后,点击Stop,进行分析
在这里插入图片描述
查看捕获结果
在这里插入图片描述
在这里插入图片描述
检查分配记录步骤:

  1. 点击 Class Name 列标题以按字母顺序排序。然后,点击一个类名称。此时下侧将出现
  2. Instance View 窗格,显示该类的每个实例
  3. 在 Instance View 窗格中,点击一个实例。此时下方将出现 References 标签页,显示该实例被4. 分配到何处以及在哪个线程中。
  4. 在 References 标签页中,右键点击任意行并选择 Jump to Source,以在编辑器中打开该代码

菜单查看说明
在这里插入图片描述
菜单-检查的堆:

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

菜单-分配:

  • Arrange by class:根据类名称对所有分配进行分组。这是默认值

  • Arrange by package:根据软件包名称对所有分配进行分组

  • Arrange by callstack:将所有分配分组到其对应的调用堆栈

  • 捕获Native方式查看内存分配
    捕获Native
    在这里插入图片描述
    native结果数据
    在这里插入图片描述
    结果信息说明:

  • Allocations:在选定时间段内通过 malloc() 或 new 运算符分配的对象数

  • Deallocations:在选定时间段内通过 free() 或 delete 运算符解除分配的对象数

  • Allocations Size:在选定时间段内所有分配的总大小(以字节为单位)

  • Deallocations Size:在选定时间段内所有已释放内存的总大小(以字节为单位)

  • Total Count:Allocations 列中的值减去 Deallocations 列中的值所得的结果

  • Remaining Size:Allocations Size 列中的值减去 Deallocations Size 列中的值所得的结果

7. 捕获java/kotlin方式查看内存分配

在这里插入图片描述
Allocation Tracking下拉菜单说明

  • Full:捕获内存中的所有对象分配。这是 Android Studio 3.2 及更低版本中的默认行为
  • Sampled:定期对内存中的对象分配情况进行采样。
  • Off:停止跟踪应用的内存分配
8. 堆转储文件导入和导出
  1. 堆转储文件导出
    在Sessions列表中,点击会话条目右侧的 Export method trace 或 Export system trace 按钮
    在这里插入图片描述
  2. 堆转储文件导入
    Sessions 窗格中点击 Start new profiler session 图标"+",然后选择 Load from file
    在这里插入图片描述

内存性能分析器中的泄漏检测

  1. 检查内存泄漏
    捕获堆转储(Capture heap dump)检测期间操作设备,完成后点击Stop按钮,检测结束后,显示有内存泄漏及内存泄漏的数目
    在这里插入图片描述

  2. 如何查看内存泄漏的位置
    双击内存泄漏的位置,显示内存泄漏的列表
    在这里插入图片描述

  3. 点击列表中其中一个,显示实例对象
    在这里插入图片描述

  4. 点击实例对象,显示详细信息
    在这里插入图片描述

  5. 切换到References选项卡,并点击show nearest GC root only
    在这里插入图片描述

  6. 右键选择jump to source在这里插入图片描述

  7. 跳转到源码,可以看到是thread引起的内存泄漏
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值