百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Android调优 使用内存分析器查看应用的内存使用情况

liuian 2025-04-01 19:47 111 浏览

内存分析器是 Android Profiler 中的一个组件,可帮助开发者识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动。它显示一个应用内存使用量的实时图表,让开发者可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

打开内存分析器的步骤如下:

  1. 依次点击 View > Tool Windows > Profiler(也可以点击工具栏中的 Profile 图标 )。
  2. 从 Android Profiler 工具栏中选择要分析的设备和应用进程,如果您已通过 USB 连接设备但系统未列出该设备,请确保您已启用 USB 调试。
  3. 点击 MEMORY 时间轴上的任意位置以打开内存分析器

1 内存分析器概览

当首次打开内存分析器时,可以看到一条表示应用内存使用量的详细时间轴,并可使用各种工具强制执行垃圾回收、捕获堆转储以及记录内存分配。

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

  1. 用于强制执行垃圾回收事件的按钮。
  2. 用于捕获堆转储的按钮。只有在连接到搭载 Android 7.1(API 级别 25)或更低版本的设备时,系统才会在堆转储按钮右侧显示用于记录内存分配情况的按钮。
  3. 用于指定性能分析器多久捕获一次内存分配的下拉菜单。选择适当的选项可帮助开发者在进行性能剖析时提高应用性能。
  4. 用于缩放时间轴的按钮。
  5. 用于跳转到实时内存数据的按钮。
  6. 事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。
  7. 内存使用量时间轴,它会显示以下内容:

一个堆叠图表,显示每个内存类别当前使用多少内存,如左侧的 y 轴以及顶部的彩色键所示。

一条虚线,表示分配的对象数,如右侧的 y 轴所示。

每个垃圾回收事件的图标。

在 Android 8.0 及更高版本上,系统会一律为可调试的应用启用高级性能剖析,如果使用的是搭载 Android 7.1 或更低版本的设备,并非所有分析数据在默认情况下都可见。

2 内存计算方式


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

3 查看内存分配情况

内存分配情况图表显示内存中每个 Java 对象和 JNI 引用的分配方式:

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

如需录制 Java 和 Kotlin 分配情况,可以选择 Record Java / Kotlin allocations,然后选择 Record

如果设备搭载的是 Android 8 或更高版本,则内存分析器界面将转换为显示正在进行录制的单独屏幕。可以与录制上方的迷你时间轴进行交互(例如,更改选择范围)。如需完成录制,选择 Stop 图标


4 如需检查分配记录,请按以下步骤操作:

浏览列表以查找堆计数异常大且可能存在泄漏的对象。为帮助查找已知类,点击 Class Name 列标题以按字母顺序排序。然后,点击一个类名称。此时右侧将出现 Instance View 窗格,显示该类的每个实例。

Instance View 窗格中,点击一个实例。此时下方将出现 Call Stack 标签页,显示该实例被分配到何处以及在哪个线程中。

Call Stack 标签页中,右键点击任意行并选择 Jump to Source,以在编辑器中打开该代码。

5 捕获堆转储

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

  • 应用分配了哪些类型的对象,以及每种对象有多少。
  • 每个对象当前使用多少内存
  • 在代码中的什么位置保持着对每个对象的引用
  • 对象所分配到的调用堆栈

点击 Capture heap dump,然后选择 Record,在转储堆期间,Java 内存量可能会暂时增加,这是很正常的现象,因为堆转储与对应的应用发生在同一进程中,并需要一些内存以收集数据。

在类列表中,可以查看以下信息

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

从左侧的菜单中,选择需检查的堆:

  • default heap:当系统未指定堆时。
  • app heap:您的应用在其中分配内存的主堆。
  • image heap:系统启动映像,包含启动期间预加载的类。此处的分配确保绝不会移动或消失。
  • zygote heap:写时复制堆,其中的应用进程是从 Android 系统中派生的。

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

  • Arrange by class:根据类名称对所有分配进行分组。这是默认值。
  • Arrange by package:根据软件包名称对所有分配进行分组。
  • Arrange by callstack:将所有分配分组到其对应的调用堆栈。只有在记录分配期间捕获堆转储时,此选项才有效。即便如此,堆中也很可能有在您开始记录之前分配的对象,所以会先显示这些分配,直接按类名称列出它们。


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

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


6 内存分析器中的泄漏检测

在内存分析器中分析堆转储时,可以过滤 Android Studio 认为可能表明应用中的 ActivityFragment 实例存在内存泄漏的分析数据。

过滤器显示的数据类型包括:(需要 首先需要 捕获堆转储)

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

在某些情况(如以下情况)下,过滤器可能会产生误报:

  • 已创建 Fragment,但尚未使用它。
  • 正在缓存 Fragment,但它不是 FragmentTransaction 的一部分。

相关推荐

xp永久激活工具(xp永久激活码)

如果你需要重置XP的激活器,你需要先打开“开始”菜单,然后选择“运行”。在运行对话框中,输入“regedit”,然后按回车键。这会打开注册表编辑器。在编辑器中,使用左侧面板来导航到“HKEY_LOCA...

cad2008激活序列号(激活cad的序列号)

1.首先运行“AutoCAD2008安装包”中的“Setup.exe”安装AutoCAD2008,安装过程需要十分钟左右;2.第一次运行AutoCAD2008时,请在注册界面输入序列号666-9...

自己可以重装电脑系统么(可以自己重装系统吗)

电脑自身也可以重装系统。1.电脑是一个可编程的设备,通过特定的步骤和操作,用户可以自行进行系统重装。2.重装系统的过程包括备份重要数据、获取系统安装介质、重新启动电脑进入安装界面、按照指引选择系统...

win11免费下载(win11正式版下载)
  • win11免费下载(win11正式版下载)
  • win11免费下载(win11正式版下载)
  • win11免费下载(win11正式版下载)
  • win11免费下载(win11正式版下载)
qq邮箱在哪里找账号(qq邮箱账号在qq里怎么找)
  • qq邮箱在哪里找账号(qq邮箱账号在qq里怎么找)
  • qq邮箱在哪里找账号(qq邮箱账号在qq里怎么找)
  • qq邮箱在哪里找账号(qq邮箱账号在qq里怎么找)
  • qq邮箱在哪里找账号(qq邮箱账号在qq里怎么找)
苹果处理器性能排行(苹果处理器性能排行榜平板)

1、截止至最新的iPhoneXS上搭载的A12,从iPhone4首次搭载A4处理器开始,目前已经有9代的苹果A系列处理器;2、A4是一颗45nm制程的ARMCortex-A8的单核心处理器,GP...

苹果手机怎么录屏(苹果手机怎么录屏在哪里打开)

iPhone手机的屏幕录制功能需要在设置里面进行添加,添加成功之后,就可以使用录屏功能了。点击控制中心进入iPhone手机的设置,来到设置之后,找到控制中心选项并点击。点击加号添加录屏功能来到控制中心...

电脑怎么打开系统还原(电脑怎么开启系统还原的功能)

右键此电脑,属性,系统保护,配置,勾选启用系统保护,确定,创建,输入还原点描述,点击创建,系统提示已成功创建还原点,点击关闭,当需要还原的时候,点击上面的系统还原,选择需要还原的节点,点击完成,即可开...

ghost系统下载xp(非ghostxp下载)

蒲公英系统网站能下载。下载后缀为gho的xp系统,使用体验非常棒效果非常好。以上信息根据美国华盛顿操作系统邮报最新消息显示。不能装钉钉的。在WindowsXP系统上是不能安装钉钉来上网课的。要使用钉...

电脑安全模式怎么用(电脑安全模式怎么按出来)

1.进入运行输入指令确定键盘上按下win+r组合键,打开运行,输入msconfig,点击确定。2.进引导系统选安全引导进入页面后,点击引导,选中系统,勾选安全引导,点击确定。3.重启进入安全模式弹出...

win10可选更新(win10可选更新和必要更新)

首先确保系统是激活状态。如果不是,可以用小马激活或KMS激活软件等工具激活。1.打开开始菜单,选择“设置”,选择“更新和安全”,设置自动检测安装更新,接受win10推送。电脑接受win10推送后...

讯飞语音输入法(讯飞语音输入法电脑版)

手机中讯飞语音输入法操作起来非常的简便。我们可以先打开讯飞语音。输入法在输入法键盘上的上端有一个麦克风的标识,我们只要点开麦克风的标识,就可以说话了,上面就会出现相应的文字了。文字可以自动帮我们识别修...

电脑品牌型号在哪里看(电脑选什么牌子的好)

查看自己电脑品牌型号和具体配置的具体方法:1.右键点击桌面上的“这台电脑”图标,弹出的菜单中选择“属性”。2.在此界面即可看到你的电脑的CPU品牌(AMD)、型号(A6-5200)、频率(2.0GHz...

网卡驱动装不上怎么回事(网卡驱动装不了怎么办)

可能原因如下1、这种情况是因为系统中没有集成电脑网卡所对应的驱动程序。2、这种情况可以利用鲁大师查询网卡的具体型号,然后去官网或者网络上下载对应的驱动重新安装就可以正常上网了。可能原因如下:1,估计是...

手机输入法怎么打繁体字(手机怎样输入繁体)

步骤如下:1.在手机设置页面找到输入法设置,如果能搜索,会帮助找到输入法设置页面。2.在系统的输入法设置页面,找到输入法自身的设置页面入口。3.在输入法自设难度设置页面,找到简繁切换的设置页面。4.勾...