低内存终止器

Android 平台的运行前提是“空闲内存是被浪费的内存”。Android 始终尝试使用所有可用内存。例如,系统在应用关闭后仍将其保留在内存中,以便用户可以快速切换回它们。因此,Android 设备通常在很少的空闲内存下运行(请参阅此处 Android 内存分配)。

Android 低内存终止器 (LMK) 守护进程监视正在运行的 Android 系统的内存状态,并通过终止最不重要的进程来响应高内存压力,以使系统保持在可接受的性能水平。

为了决定终止哪个进程,LMK 守护进程使用一个名为 oom_adj_score内存不足分数来优先处理正在运行的进程。分数高的进程会首先被终止。后台应用首先被终止;系统进程最后被终止。下表列出了从高到低的 LMK 评分类别。第一行中分数最高的项目将首先被终止。

Android processes ranked from highest score to lowest: Background apps, previous app, home app,
             services, perceptible apps, foreground app, persistent, system, and native.
图 1. Android 进程,高分在顶部,低分在底部。

Android Vitals 中的 LMK 指标

Android Vitals 可以帮助您监控和改进应用的 LMK 率。Android Vitals 只测量一种 LMK 率:用户感知的 LMK 率

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

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

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

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

图 3. Android Vitals 中 LMK 率概览。

内存分析工具

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

  • 查看您的应用如何随时间分配内存。您可以找到一个实时图表,显示您的应用正在使用多少内存、已分配的 Java 对象数量以及垃圾回收发生的时间。
  • 在您的应用运行时启动垃圾回收事件并获取 Java 堆快照。
  • 记录您应用的内存分配,检查所有已分配的对象,并查看每次分配的堆栈跟踪。

如果您的游戏运行在原生引擎上,请使用 HWAddress Sanitizer 调试原生内存分配。

Android Studio Memory Profiler

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

图 4. 在 Android Studio Memory Profiler 中查看全局 JNI 引用。

Unity 内存分析工具

如果您正在使用 Unity 引擎构建应用,可以遵循Unity 内存分析指南。Unity 提供了两种工具来分析您在 Unity 应用中的内存使用情况。

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

Memory module shows memory allocations such as texture memory and mesh memory.
图 5. Unity Profiler 窗口,已选择内存模块。

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

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

虚幻引擎内存洞察

使用虚幻引擎构建的应用可以使用 Unreal Memory Insights 来查看内存分配和解除分配的详细信息,包括与内存块相关的低级别内存 (LLM) 标签和调用堆栈。

Memory Insights 查询系统可以在任何时间点找到实时分配,识别内存使用的变化,定位内存泄漏,并区分短期分配和长期分配。

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

Memory Insights tracker showing main memory graph, live allocation count, and alloc/free event count.
图 6. 虚幻引擎的 Memory Insights 跟踪器。

低内存洞察

Android 提供回调和 API,使您能够缩减游戏的内存需求并确定之前的游戏运行为何被终止。

回调

不要注册已弃用的 trim 回调。当系统达到内存限制时,Android 没有用于检测原生内存压力事件的 API。trim 回调在防止低内存终止方面没有帮助,因此 Android 弃用了所有这些回调,除了 TRIM_MEMORY_UI_HIDDENTRIM_MEMORY_BACKGROUND

游戏终止

Android 尝试使用所有可用内存来缓存应用和游戏,以确保它们快速加载(从而改善用户体验),但当内存变得有限时,系统会终止最占用内存的应用和游戏,以释放内存用于设备的正常运行。

帮助您实现更好游戏内存使用的信息、洞察和最佳实践包括:

  • 使用 ApplicationExitInfo:此 API 返回 Android 系统终止上一个游戏运行的原因。使用 ApplicationExitInfo 检查是否因低内存导致上一个进程终止。检查游戏是否因低内存而被终止,以便可以针对该设备优化游戏以使用更少的内存。
  • 查看总物理 RAM:为了防止游戏在前台运行时被终止并匹配设备功能,请查看每个设备的总物理 RAM 以实现精细粒度,从而根据此调整游戏内存使用情况。如果目标是防止应用在移至后台后不久被终止(以允许玩家多任务处理),请使用 trim 回调(特别是 TRIM_MEMORY_UI_HIDDEN)来减少您的游戏内存使用量。

其他资源