低内存终止守护程序

Android 平台在运行时不会浪费可用的内存。Android 会一直尝试利用所有可用内存。例如,系统会在应用关闭后将其保留在内存中,以便用户快速切回到这些应用。因此,通常情况下,Android 设备在运行时几乎没有可用的内存(请参阅此处的 Android 内存分配)。

Android 低内存终止守护程序 (LMK) 守护程序进程可监控运行中的 Android 系统的内存状态,并通过终止最不必要的进程来应对内存压力较高这一问题,使系统以可接受的水平运行。

LMK 守护程序使用一个名为 oom_adj_score内存不足分值来确定正在运行的进程的优先级,以此决定要终止的进程。得分最高的进程最先被终止。后台应用最先被终止,系统进程最后被终止。下表列出了从高到低的 LMK 评分类别。评分最高的类别,即第一行中的项目将最先被终止:

Android 进程的排名从高分到低分依次为:后台应用、上一个应用、主屏幕应用、服务、可感知应用、前台应用、持久性应用、系统应用和原生应用。
图 1. Android 进程,高分在上,低分在下。

Android Vitals 中的 LMK 指标

Android Vitals 可帮助您监控和降低应用的 LMK 发生率。Android Vitals 仅衡量一种 LMK 发生率:用户感知的 LMK 发生率

该指标反映了在您的所有日活跃用户中,感知过至少 1 次 LMK 的日活跃用户所占的百分比。“用户感知的 LMK”是指可能已被用户注意到的 LMK。例如,当您的应用正在显示 activity 或作为前台服务运行时发生的 LMK。

您可以在 Android Vitals 的稳定性部分下找到该指标:

图 2. 在 Android Vitals 中访问用户感知的 LMK 发生率

与其他核心重要指标(例如 ANR 和崩溃)类似,您可以过滤指标、将指标与同行指标进行比较,或监控指标在一段时间内的变化(最长 3 年)。自 2025 年 1 月 28 日起,现有应用将有数据可用。

图 3. Android Vitals 中的 LMK 发生率概览。

内存性能分析工具

以下工具可以通过以下方式帮助您查找和诊断内存问题:

  • 了解您的应用在一段时间内是如何分配内存的。您可以找到一个实时图表,其中显示了应用的内存用量、分配的 Java 对象数量以及垃圾回收事件发生的时间。
  • 发起垃圾回收事件,并在应用运行时拍摄 Java 堆的快照。
  • 记录应用的内存分配情况,检查所有分配的对象,并查看每项分配的堆栈轨迹。

Android Studio 内存分析器

Android Studio 将 Memory Profiler 作为 Android Profiler 的组件提供,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动。该分析器会显示应用内存用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。

图 4. 在 Android Studio 内存分析器中查看全局 JNI 引用。

Unity 内存性能分析工具

如果您使用 Unity Engine 构建应用,可以遵循 Unity 内存性能分析指南。Unity 提供了两种工具来分析 Unity 中应用的内存用量。

第一个是内存性能分析器模块,它是一个内置性能分析器,可为您提供有关应用使用内存位置的基本信息。

“内存”模块会显示纹理内存和网格内存等内存分配。
图 5. 选择了内存模块的 Unity 性能分析器窗口。

第二种工具是内存性能分析器软件包,这是一个可添加到项目中的 Unity 软件包。该软件包会向 Unity 编辑器添加一个额外的内存分析器窗口。借助内存分析器,您可以更详细地分析应用的内存用量。您可以存储和比较快照以查找内存泄漏,或查看内存布局以查找内存碎片化问题。

图 6. 使用“Memory Profiler”窗口分析内存快照。

Unreal Memory Insights

使用 Unreal Engine 构建的应用可以使用 Unreal Memory Insights 查看有关内存分配和取消分配的详细信息,包括与内存块关联的低级内存 (LLM) 标记和调用堆栈。

Memory Insights 查询系统可以随时查找实时分配,确定内存用量变化、定位内存泄露,以及区分短期分配和长期分配。

从 UE 5.4 开始,Memory Insights 支持使用调用堆栈跟踪 Android 项目的内存。

内存分析器跟踪器,显示主内存图表、实时分配计数和分配/释放事件计数。
图 6. Unreal 的内存分析跟踪器。

其他资源