ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Android Studio Profiler内存检测

2021-06-21 15:00:19  阅读:243  来源: 互联网

标签:对象 转储 Profiler 实例 Studio 内存 Android 分配


Profiler 模块说明

 

1.Android Profiler 显示当前正在剖析的进程和设备。
2在 Sessions 窗格中,选择要查看的会话,或启动一个新的剖析会话。
3.使用缩放按钮控制要查看的时间轴范围,或使用 Attach to live 按钮跳转到实时更新。
4.事件时间轴显示与用户输入相关的事件,包括键盘活动、音量控制变化和屏幕旋转。
5.共享时间轴视图,包括 CPU、内存、网络和耗电量图表。

 

Memory Profiler 模块说明

 

  1. 用于强制执行垃圾回收事件的按钮。
  2. 用于捕获堆转储的按钮。

注意:只有在连接到搭载 Android 7.1(API 级别 25)或更低版本的设备时,才会在堆转储按钮右侧显示用于记录内存分配的按钮。

  1. 用于指定性能剖析器多久捕获一次内存分配的下拉菜单。选择适当的选项可帮助您在性能剖析时提高应用性能。一般使用默认就行。
  2. 用于缩放时间轴的按钮。
  3. 用于跳转到实时内存数据的按钮。
  4. 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。
  5. 内存使用量时间轴,它会显示以下内容:
    • 一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示。
    • 一条虚线,表示分配的对象数,如右侧的 y 轴所示。
    • 每个垃圾回收事件的图标。

 

内存计数说明

 

  • 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++ 中分配的对象。

 

(1)查看内存分配
内存分配为显示内存中的每个 Java 对象和 JNI 引用如何分配。内存性能分析器可显示有关对象分配的以下信息:

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

如果使用的是 Android 8.0 或更高版本,可以随时查看对象分配,具体操作步骤如下:在时间轴上拖动以选择要查看哪个区域的分配。

如果使用的是 Android 7.1 或更低版本,请点击内存性能分析器工具栏中的 Record memory allocations 录制图标。记录时,内存性

能分析器会跟踪您的应用中发生的所有分配。完成后,点击 Stop recording 图标 。
如需检查分配记录,请按以下步骤操作:

  1. 浏览列表以查找堆计数异常大且可能存在泄露的对象。
  2. 在 Instance View 窗格中,点击一个实例。此时下方将出现 Call Stack 标签页,显示该实例被分配到何处以及在哪个线程中。
  3. 在 Call Stack 标签页中,右键点击任意行并选择 Jump to Source,以在编辑器中打开该代码。

 

(2)捕获堆转储
堆转储显示在捕获堆转储时您的应用中哪些对象正在使用内存。特别是在长时间的用户会话后,堆转储会显示您认为不应再位于内存中却仍在内存中的对象,从而帮助识别内存泄露。
捕获堆转储后,可以查看以下信息:

  • 您的应用分配了哪些类型的对象,以及每种对象有多少。
  • 每个对象当前使用多少内存。
  • 在代码中的什么位置保持着对每个对象的引用。
  • 对象所分配到的调用堆栈。(目前,对于 Android 7.1 及更低版本,只有在记录分配期间捕获堆转储时,才会显示调用堆栈的堆转储。)


点击内存性能分析器工具栏中的 Dump Java heap 图标捕获堆转储 。

 

在类列表中查看以下信息:

  • Allocations:堆中的分配数。
  • Native Size:此对象类型使用的原生内存总量(以字节为单位)。只有在使用 Android 7.0 及更高版本时,才会看到此列(如 Bitmap)使用原生内存。
  • Shallow Size:此对象类型使用的 Java 内存总量(以字节为单位)。
  • Retained Size:为此类的所有实例而保留的内存总大小(以字节为单位)。


点击一个类名称可在右侧打开 Instance View 窗口列出的每个实例都包含以下信息:

  • Depth:从任意 GC 根到选定实例的最短跳数。
  • Native Size:原生内存中此实例的大小。 只有在使用 Android 7.0 及更高版本时,才会看到此列。
  • Shallow Size:Java 内存中此实例的大小。
  • Retained Size:此实例所支配内存的大小。


如需检查堆,请按以下步骤操作:

  1. 浏览列表以查找堆计数异常大且可能存在泄露的对象
  2. 在 Instance View 窗格中,点击一个实例。此时下方将出现 References 标签页,显示对该对象的每个引用。
  3. 在 References 标签页中,如果发现某个引用可能在泄露内存,请右键点击它并选择 Go to Instance。这样会从堆转储中选择相应的实例,从而向显示它自己的实例数据。

 

(3)泄露检测
在内存性能分析器中分析堆转储时,可以过滤 Android Studio 认为可能表明应用中的 Activity 和 Fragment 实例存在内存泄露的分析数据。
过滤器显示的数据类型包括:

  • 已销毁但仍被引用的 Activity 实例。
  • 没有有效的 FragmentManager 但仍被引用的 Fragment 实例

 

标签:对象,转储,Profiler,实例,Studio,内存,Android,分配
来源: https://blog.csdn.net/mingzaizai_123/article/details/118086390

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有