当前位置: 首页 > news >正文

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

目录

      • Android Studio中内存分析工具Memory profiler的使用
        • 1. 打开Memory Profiler
        • 2. 工具使用
        • 3. 内存选项说明
        • 4. 内存性能分析器概览
        • 5. 内存计算方式
        • 6. 查看内存分配
        • 7. 捕获java/kotlin方式查看内存分配
        • 8. 堆转储文件导入和导出
      • 内存性能分析器中的泄漏检测

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引起的内存泄漏
    在这里插入图片描述

http://www.lryc.cn/news/118386.html

相关文章:

  • Qt下载慢/无法下载解决方式
  • 【UE4 RTS】04-Camera Pan
  • 出现raise NotImplementedError报错
  • 第一百二十二天学习记录:C++提高:STL-vector容器(上)(黑马教学视频)
  • 《Linux从练气到飞升》No.11 初识操作系统
  • 什么是 XSS 攻击?
  • 基于Spring Boot的招聘网站的设计与实现(Java+spring boot+MySQL)
  • 中级课程——CSRF
  • 面试热题(岛屿数量)
  • 【WebRTC---源码篇】(二十四)GCC获取码率后的分配
  • 数据可视化工具LightningChart .NET正式发布v10.5.1——拥有全新的3D新功能
  • AWS认证SAA-C03每日一题
  • ASP.NET Core MVC -- 将视图添加到 ASP.NET Core MVC 应用
  • 基于R做宏基因组结果的PCoA分析
  • 8.10 算法刷题【1道题】
  • Apache Maven:从构建到部署,一站式解决方案
  • 文章四:版本控制策略 - 穿越时光机:Git版本控制进阶技巧
  • 爬虫如何应对网站的反爬机制?如何查找user-agent对应的值
  • 一个概率论例题引发的思考
  • 司徒理财:8.11黄金最新走势分析早盘1914现价多
  • 请写一个非对称加密工具 示例包括完整的通信流程
  • 近地面无人机植被定量遥感与生理参数反演技术
  • 卡巴斯基为基于Linux的嵌入式设备推出专用解决方案
  • Word转PDF工具哪家安全?推荐好用的文件格式转换工具
  • dma_mmap_coherent函数的使用
  • MySQL_DQL语句(查询语句以及常用函数)
  • 一步步教你实现JWT认证和授权
  • 【python 深度学习】解决遇到的问题
  • maxwell 基于zookeeper的高可用方案
  • 【JavaScript】match用法 | 正则匹配