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

2020-09-02  本文已影响0人  资本家大恶人

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

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

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

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

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

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

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

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

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

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

image

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

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

上一篇 下一篇

猜你喜欢

热点阅读