返回「计算机、信息技术与工程」
Android PSS 内存的含义与分析方法
本文目录 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或系统提供的等价明细;- 场景、设备、系统版本、构建配置和采样时间。
可复现的分析流程
- 定义场景:冷启动、登录、进入关卡、反复切换、退回大厅等。
- 控制变量:固定设备、构建、画质、资源包和操作脚本。
- 建立基线:在相同时间点采样多次,记录中位数和波动范围。
- 观察趋势:完成一轮操作并回到稳定状态,判断 PSS 与各分类是否持续抬升。
- 交叉验证:用对象快照、分配调用栈或映射明细定位增长来源。
- 验证释放:触发资源卸载、场景切换或 GC 后复测;注意分配器保留内存不等于仍有可达对象。
避免常见误判
- 一次 PSS 变大不等于泄漏,缓存、资源预热和分配器扩容都可能造成增长。
- Java/Native/Graphics 的分类不能直接映射为 Unity 的 Managed/Native 分类。
- 系统回收压力、后台进程和驱动会影响结果,跨设备绝对值不可直接横比。
- “回不到启动值”不是充分证据;应寻找多轮操作后单调增长且无法解释的保留对象或映射。