Android 平台的运行前提是空闲内存就是浪费的内存。Android 始终尝试使用所有可用内存。例如,系统在应用关闭后仍将其保留在内存中,以便用户可以快速切换回这些应用。因此,Android 设备通常在很少的空闲内存下运行(请参阅此处 Android 内存分配)。
Android 低内存杀手 (LMK) 守护程序进程会监控正在运行的 Android 系统的内存状态,并通过终止最不必要的进程来应对高内存压力,以保持系统以可接受的水平运行。
为了决定要终止哪个进程,LMK 守护程序使用名为 oom_adj_score 的内存不足分数来优先处理正在运行的进程。分数高的进程会首先被终止。后台应用最先被终止;系统进程最后被终止。下表列出了 LMK 评分类别,从高到低。第一行中得分最高的项目最先被终止

Android Vitals 上的 LMK 指标
Android Vitals 可以帮助您监控和改进应用的 LMK 速率。Android Vitals 只衡量一个 LMK 速率:用户感知 LMK 速率。
该指标反映了经历至少一次用户感知 LMK 的每日活跃用户百分比。用户感知 LMK 是用户可能已经注意到的 LMK。例如,当您的应用显示 activity 或作为前台服务运行时发生的 LMK。
您可以在 Android Vitals 的稳定性部分下找到该指标

与 ANR 和崩溃等其他核心重要指标类似,您可以过滤指标、将您的指标与同行进行比较,或长时间(最长 3 年)监控指标的变化。现有应用的数据从 2025 年 1 月 28 日开始提供。

内存分析工具
以下工具可以帮助您通过以下方式查找和诊断内存问题
- 查看您的应用如何随时间分配内存。您可以找到一个实时图表,显示您的应用使用了多少内存、分配的 Java 对象数量以及何时发生垃圾回收。
- 在您的应用运行时启动垃圾回收事件并获取 Java 堆快照。
- 记录您应用的内存分配,检查所有已分配的对象,并查看每次分配的堆栈跟踪。
如果您的游戏运行在原生引擎上,请使用 HWAddress Sanitizer 调试原生内存分配。
Android Studio Memory Profiler
Android Studio 提供 Memory Profiler 作为 Android Profiler 的一个组件,可帮助您识别可能导致卡顿、冻结甚至应用崩溃的内存泄漏和内存抖动。分析器会实时显示您应用的内存使用情况图表,并允许您捕获堆转储、强制垃圾回收和跟踪内存分配。

Unity 内存分析工具
如果您使用 Unity 引擎构建应用,可以遵循Unity 内存分析指南。Unity 提供两种工具来分析 Unity 应用中的内存使用情况。
第一个是 Memory Profiler 模块,它是一个内置分析器,可为您提供有关应用内存使用位置的基本信息。

第二个工具是 Memory Profiler 包,这是一个您可以添加到项目的 Unity 包。该包将一个额外的 Memory Profiler 窗口添加到 Unity Editor。Memory Profiler 使您能够更详细地分析应用中的内存使用情况。您可以存储和比较快照以查找内存泄漏或查看内存布局以查找内存碎片问题。

Unreal Memory Insights
由 Unreal Engine 构建的应用可以使用 Unreal Memory Insights 查看内存分配和释放的详细信息,包括与内存块关联的低级内存 (LLM) 标签和调用堆栈。
Memory Insights 查询系统可以查找任何时间点的实时分配,识别内存使用变化,定位内存泄漏,并区分短期分配和长期分配。
从 UE 5.4 开始,Memory Insights 支持对 Android 项目进行带调用堆栈的内存跟踪。

低内存洞察
Android 提供回调和 API,使您能够修剪游戏的内存需求并确定以前的游戏运行为何被终止。
回调
不要注册已废弃的 trim 回调。当系统达到内存限制时,Android 没有用于检测原生内存压力事件的 API。Trim 回调对防止低内存终止没有帮助,因此 Android 废弃了所有这些回调,除了 TRIM_MEMORY_UI_HIDDEN
和 TRIM_MEMORY_BACKGROUND
。
游戏终止
Android 尝试使用所有可用内存来缓存应用和游戏,以确保它们快速加载(从而改善用户体验),但当内存变得有限时,系统会终止最耗内存的应用和游戏,以释放内存供设备正常运行。
以下信息、洞察和最佳实践可帮助您更好地使用游戏内存
- 使用
ApplicationExitInfo
:此 API 返回 Android 系统终止先前游戏运行的原因。使用ApplicationExitInfo
检查低内存是否是先前进程运行终止的原因。检查游戏是否因低内存而被终止,以便可以优化游戏以在该设备上使用更少的内存。 - 查看总物理 RAM:为了防止游戏在前台运行时被终止并匹配设备功能,请查看每个设备的总物理 RAM,以便根据此数据进行细粒度调整游戏内存使用情况。如果目标是防止应用在移到后台后立即被终止(允许玩家多任务处理),请使用 trim 回调(特别是
TRIM_MEMORY_UI_HIDDEN
)来减少您的游戏内存使用量。