使用 Memory Profiler 查看 Java 堆和内存分配

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

要打开 Memory Profiler,请按以下步骤操作:

  1. 依次点击 View > Tool Windows > Profiler(您也可以点击工具栏中的 Profile 图标 

  2. 从 Android Profiler 工具栏中选择要分析的设备和应用进程。如果您已通过 USB 连接设备但系统未列出该设备,请确保您已启用 USB 调试

  3. 点击 MEMORY 时间轴上的任意位置以打开 Memory Profiler。

或者,您可以从命令行使用 dumpsys 来检查您的应用内存,还可以在 logcat 中查看 GC 事件

为帮助防止这些问题,您应使用 Memory Profiler 执行以下操作:

在时间轴上查找可能会导致性能问题的不理想的内存分配模式。

转储 Java 堆以查看在任何给定时间哪些对象耗尽了内存。在很长一段时间内进行多次堆转储有助于识别内存泄露。

记录正常用户交互和极端用户交互期间的内存分配,以准确识别您的代码在何处短时间内分配了过多对象,或分配了泄露的对象。

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

  • 捕获堆转储

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

捕获堆转储后,您可以查看以下信息:

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

要捕获堆转储,请点击 Memory Profiler 工具栏中的 Dump Java heap 图标 

。 在转储堆期间,Java 内存量可能会暂时增加。 这很正常,因为堆转储与您的应用发生在同一进程中,并需要一些内存来收集数据。

堆转储出现在内存时间轴下方,显示堆中的所有类类型

在 Memory Profiler 中分析堆转储时,您可以过滤 Android Studio 认为可能表明应用中的 Activity和 Fragment 实例存在内存泄露的分析数据。

过滤器显示的数据类型包括:

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

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

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

如需使用此功能,请先捕获堆转储将堆转储文件导入 Android Studio。如需显示可能泄露内存的 Fragment 和 Activity,请勾选 Memory Profiler 的堆转储窗格中的 Activity/Fragment Leaks 复选框

image

使用 Memory Profiler 时,您应对应用代码施加压力并尝试强制内存泄露。在应用中引发内存泄露的一种方式是,先让其运行一段时间,然后再检查堆。泄露在堆中可能逐渐汇聚到分配顶部。不过,泄露越小,为了看到泄露而需要运行应用的时间就越长。

您还可以通过以下某种方式来触发内存泄露:

  • 在不同的 Activity 状态下,先将设备从纵向旋转为横向,再将其旋转回来,这样反复旋转多次。旋转设备经常会使应用泄露 [Activity][Context] 或 [View] 对象,因为系统会重新创建 [Activity],而如果您的应用在其他地方保持对这些对象其中一个的引用,系统将无法对其进行垃圾回收。
  • 在不同的 Activity 状态下,在您的应用与其他应用之间切换(导航到主屏幕,然后返回到您的应用)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值