Android 低内存终止守护程序 (LMK) 可监控运行中的 Android 系统的内存状态,并通过终止最不必要的进程来应对内存压力大的问题。Android Vitals 会在 Google Play 管理中心内跟踪并报告用户感知的 LMK 终止事件,以帮助您找出影响用户的内存压力问题。
Android Vitals 中的 LMK 指标
Android Vitals 可帮助您监控和降低应用的 LMK 发生率。Android Vitals 仅衡量一种 LMK 发生率:用户感知的 LMK 发生率。
该指标反映了在您的所有日活跃用户数中,体验过至少 1 次 LMK 的用户所占的百分比。“用户感知的 LMK”是指可能已被用户注意到的 LMK。例如,当您的应用正在显示 activity 或作为前台服务运行时发生的 LMK。 这些终止会导致进程立即非正常退出。 对最终用户来说,这看起来像是应用崩溃,通常会绕过标准的生命周期状态保存机制,导致用户进度丢失。
Android Vitals 重点关注这些进程终止,因为它们是内存管理不当问题的高保真代理。LMK 率超过 1% 表示迫切需要立即采取行动。不过,LMK 触发率较低并不一定意味着应用的内存用量处于健康状态。该较低的比率可能意味着 LMK 守护程序经常在进程处于后台时终止进程,这会降低“温启动”性能和多任务处理流畅度。
您可以在 Android Vitals 的稳定性部分下找到该指标:
与 ANR 和崩溃等类似的 Android Vitals 核心指标一样,您可以过滤这些指标、将您的指标与类似应用进行比较,或长期(最长 3 年)监控指标的变化。对于现有应用,系统会提供自 2025 年 1 月 28 日起的数据。
低内存终止守护程序的工作原理
Android 平台在运行时不会浪费可用的内存。 Android 会一直尝试利用所有可用内存。例如,系统会在应用关闭后将其保留在内存中,以便用户快速切回到这些应用。因此,通常情况下,Android 设备在运行时几乎没有未使用的内存(请参阅进程间的内存分配)。
为了在可用内存不足时决定要终止的进程,低内存终止守护程序 (LMK) 会使用一个名为 oom_adj_score 的内存不足分值来确定正在运行的进程的优先级。最高得分的进程最先被终止。后台应用最先被终止,系统进程最后被终止。下表列出了从高到低的 LMK 评分类别。
评分最高的类别,即第一行中的项目将最先被终止:
内存分析工具
以下工具可帮助您通过以下方式查找和诊断内存问题:
- 了解您的应用在一段时间内是如何分配内存的。您可以查看实时图表,了解应用的内存用量、分配的 Java 对象数量以及垃圾回收事件发生的时间。
- 发起垃圾回收事件,并在应用运行时拍摄 Java 堆的快照。
- 记录应用的内存分配情况,检查所有分配的对象,并查看每项分配的堆栈轨迹。
如果您的游戏在原生引擎上运行,请使用 HWAddress Sanitizer 调试原生内存分配。
Android Studio 内存分析器
Android Studio 提供了内存分析器作为 Android Profiler 的一个组件,可帮助您识别可能会导致应用卡顿、冻结甚至崩溃的内存泄漏和内存抖动。该分析器会显示应用内存用量的实时图表,让您可以捕获堆转储、强制执行垃圾回收以及跟踪内存分配。
Unity 内存分析工具
如果您使用 Unity 引擎构建应用,可以遵循 Unity 内存分析指南。Unity 提供了两个工具来分析 Unity 应用中的内存用量。
第一个是内存分析器模块,这是一个内置分析器,可为您提供有关应用在何处使用内存的基本信息。
第二个工具是内存分析器软件包,这是一个可以添加到项目中的 Unity 软件包。该软件包会向 Unity 编辑器添加一个额外的内存分析器窗口。借助内存分析器,您可以更详细地分析应用中的内存用量。您可以存储和比较快照,以查找内存泄漏问题,或查看内存布局,以查找内存碎片问题。
如需了解 Android 专用的 Unity 工作流,请参阅使用 Unity 工具检查内存用量、在 Unity 中优化内存用量和调试 Unity 游戏的 LMK。
Unreal Memory Insights
由 Unreal Engine 构建的应用可以使用 Unreal Memory Insights 查看有关内存分配和取消分配的详细信息,包括与内存块关联的低级内存 (LLM) 标记和调用堆栈。
Memory Insights 查询系统可以查找任意时间点的实时分配、识别内存用量的变化、定位内存泄漏,以及区分短期分配和长期分配。
从 UE 5.4 开始,Memory Insights 支持对 Android 项目进行带调用堆栈的内存跟踪。
如需了解 Android 专用的 Unreal 工作流,请参阅使用 Unreal 检查内存用量和在 Unreal 中优化内存用量。
内存不足数据分析
Android 提供了回调和 API,可让您减少游戏的内存用量,并确定之前游戏运行终止的原因。
回调
请勿注册已废弃的 trim 回调。Android 不提供用于在系统回收内存之前检测原生内存压力事件的 API,并且细粒度的运行内存修剪回调 (TRIM_MEMORY_RUNNING_*) 在防止内存不足终止事件方面效果不佳。
因此,Android 废弃了除 TRIM_MEMORY_UI_HIDDEN 和 TRIM_MEMORY_BACKGROUND 之外的所有修剪级别。当游戏移至后台时,使用这些剩余的回调(或引擎生命周期等效项,例如 Unity 的 OnApplicationPause 和 Unreal 的 ApplicationWillEnterBackgroundDelegate)来释放界面和辅助资源。如需了解实现详情,请参阅减少游戏中的内存。
游戏终止
Android 会尝试使用所有可用内存来缓存应用和游戏,以确保它们快速加载(从而提升用户体验),但当内存不足时,系统会终止最占用内存的应用和游戏,以释放内存供设备正常运行。
以下信息、数据分析和最佳实践可帮助您更好地利用游戏内存:
- 使用
ApplicationExitInfo:此 API 会返回 Android 系统终止上一次游戏运行的原因。使用ApplicationExitInfo检查导致先前进程退出的原因是否为内存不足 (REASON_LOW_MEMORY) 或内存限制器终止 (REASON_MEMORY_LIMITER)(请参阅适用于游戏的 ApplicationExitInfo)。检查游戏是否因内存压力而终止,以便优化游戏,使其在该设备上使用更少的内存。 - 查看物理 RAM 总量:为防止游戏在前台运行时被终止,并与设备功能相匹配,请查看每台设备的物理 RAM 总量,以便根据该总量精细调整游戏内存用量。如果目标是防止应用在移至后台后不久被终止(以便玩家执行多任务),请使用修剪回调(特别是
TRIM_MEMORY_UI_HIDDEN)来减少游戏内存用量。