内存用量(匿名 RSS + 交换空间)是 Android Vitals 中的一项指标,用于反映应用的内存用量。
匿名内存是指没有存储器中的文件支持的内存,例如堆分配和 mmap 分配的内存。常驻内存大小 (RSS) 是进程使用的(共享和非共享)内存页面的总数,这些页面保存在物理 RAM 中。对于匿名内存,当内存面临压力时,系统可以将页面写入交换空间(或 Android 上的 zRAM)。
总而言之,内存用量(匿名 RSS + 交换空间)衡量的是应用在存储空间中没有文件支持的内存页总数,包括系统在交换空间中保留的任何内存。跟踪匿名 RSS + 交换空间可确保您看到应用真实且无法逐出的内存占用。
识别高内存用量
Android Vitals
Android Vitals 会按以下进程状态细分应用的内存用量:
- 前台:应用进程可见。较高的 P99 通常会影响用户感知到的性能(卡顿或 OOM 崩溃),并且很大程度上是由保留不再需要的界面组件或 activity 造成的。
- 用户感知服务:应用进程正在可感知状态下运行。这包括前台服务、加急作业和由用户发起的数据传输作业。它还可以扩展到系统绑定的服务或其他应用绑定的服务。由于这些服务是为长时间运行的任务设计的,因此因泄漏而保留内存或未能释放资源可能会随着时间的推移而增加 P99 尾部。
- 后台:应用正在运行后台服务,或最近已转入后台,但尚未缓存。在这种情况下,后台处理泄漏和未释放的资源可能会加剧。由于此进程状态不如前台进程或可感知进程重要,因此请尽量避免在此状态下保留大量内存。
- 已缓存:应用处于已缓存状态。此状态对系统内存压力(例如 LMK)高度敏感。由于操作系统可以随时逐出此进程状态,因此仅出于调试目的提供此状态。
如需了解这些进程状态与 onTrimMemory 回调之间的关联,请参阅有关响应事件释放内存的指南。
Android Vitals 还会按 RAM 桶细分应用的内存用量。内存用量指标以每日百分位值的时间轴形式显示,同时还显示第 50 和第 90 个百分位的最新每日值。
使用尾部偏度识别内存泄漏
为帮助您识别内存泄漏,请在 Android Vitals 中查找典型用户(P50)和尾端用户(P90)之间的差异。虽然一般资源膨胀会使所有百分位的内存均匀增加,但内存泄漏会随着时间的推移而加剧,严重扭曲尾端数据。
您应按进程名称将 P90 和 P99 指标与 P50 基准进行比较。如果 P90 与 P50 的比率超过 3.5 倍,则表示长时间会话期间可能存在内存泄漏。在某些使用情形下,较高的比率并不一定表示存在内存泄漏,但您应评估具体的工作流程,以确定内存使用率升高是否属于预期行为。