返回「计算机、信息技术与工程」

Android PSS 内存的含义与分析方法

更多
Markdown 结构化数据
本文目录 5 个章节

Android PSS 内存的含义与分析方法

note · 通用化说明 原笔记中的项目截图已移入私有工作资料。本文不使用固定“合格线”,因为内存预算必须结合设备、系统版本、进程模型和业务场景确定。

PSS 是什么

PSS(Proportional Set Size,按比例分摊集)用于估算一个进程应承担的物理内存:私有页全部计入,共享页按共享进程数近似分摊。它比简单相加 RSS 更适合比较进程的总体内存压力,但仍是一次采样结果,不等于进程独占内存,也不能单独证明发生泄漏。

Android 的内存报告常见分类包括:

  • Java/Kotlin Heap:ART 管理的对象。
  • Native Heap:原生分配器管理的内存。
  • Code:可执行文件、共享库、DEX/OAT 等映射。
  • Stack:线程栈。
  • Graphics:图形缓冲和驱动相关分配;不同系统版本的归类可能变化。
  • Private Other / System / Unknown:无法归入上述类别或由系统按其他口径统计的内存。

Private Dirty、Private Clean、Shared Dirty、Shared Clean 描述页面的共享性与是否被修改;它们不是“好/坏”的标签,需要结合映射来源和变化趋势解释。

采样

adb shell dumpsys meminfo <package-name>
adb shell dumpsys meminfo --local <package-name>

必要时结合以下信息:

  • Unity Profiler 或 Memory Profiler 中的托管堆、原生对象与纹理等分类;
  • Perfetto、Android Studio Memory Profiler 或 heapprofd;
  • /proc/<pid>/smaps 或系统提供的等价明细;
  • 场景、设备、系统版本、构建配置和采样时间。

可复现的分析流程

  1. 定义场景:冷启动、登录、进入关卡、反复切换、退回大厅等。
  2. 控制变量:固定设备、构建、画质、资源包和操作脚本。
  3. 建立基线:在相同时间点采样多次,记录中位数和波动范围。
  4. 观察趋势:完成一轮操作并回到稳定状态,判断 PSS 与各分类是否持续抬升。
  5. 交叉验证:用对象快照、分配调用栈或映射明细定位增长来源。
  6. 验证释放:触发资源卸载、场景切换或 GC 后复测;注意分配器保留内存不等于仍有可达对象。

避免常见误判

  • 一次 PSS 变大不等于泄漏,缓存、资源预热和分配器扩容都可能造成增长。
  • Java/Native/Graphics 的分类不能直接映射为 Unity 的 Managed/Native 分类。
  • 系统回收压力、后台进程和驱动会影响结果,跨设备绝对值不可直接横比。
  • “回不到启动值”不是充分证据;应寻找多轮操作后单调增长且无法解释的保留对象或映射。

参考资料