{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/android-pss-memory-analysis/",
  "atlas": "https://www.pystone.net/?node=android-pss-memory-analysis#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/android-pss-memory-analysis.md",
  "context": "https://www.pystone.net/notes/android-pss-memory-analysis.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:android-pss-memory-analysis",
  "slug": "android-pss-memory-analysis",
  "title": "Android PSS 内存的含义与分析方法",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Android PSS 内存的含义与分析方法",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "d1e2d54fec9c85ef9e175ed5575db1a1d8c75932adfa1491da95ae5756241594",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Android PSS 内存的含义与分析方法",
      "anchor": "android-pss-内存的含义与分析方法",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#android-pss-%E5%86%85%E5%AD%98%E7%9A%84%E5%90%AB%E4%B9%89%E4%B8%8E%E5%88%86%E6%9E%90%E6%96%B9%E6%B3%95"
    },
    {
      "depth": 2,
      "text": "PSS 是什么",
      "anchor": "pss-是什么",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#pss-%E6%98%AF%E4%BB%80%E4%B9%88"
    },
    {
      "depth": 2,
      "text": "采样",
      "anchor": "采样",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#%E9%87%87%E6%A0%B7"
    },
    {
      "depth": 2,
      "text": "可复现的分析流程",
      "anchor": "可复现的分析流程",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#%E5%8F%AF%E5%A4%8D%E7%8E%B0%E7%9A%84%E5%88%86%E6%9E%90%E6%B5%81%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "避免常见误判",
      "anchor": "避免常见误判",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#%E9%81%BF%E5%85%8D%E5%B8%B8%E8%A7%81%E8%AF%AF%E5%88%A4"
    },
    {
      "depth": 2,
      "text": "参考资料",
      "anchor": "参考资料",
      "citation": "https://www.pystone.net/notes/android-pss-memory-analysis/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:performance-optimization-cost-frequency-scope",
      "title": "性能优化的本质是控制成本发生的频率、时机与范围",
      "url": "https://www.pystone.net/notes/performance-optimization-cost-frequency-scope/",
      "atlas": "https://www.pystone.net/?node=performance-optimization-cost-frequency-scope#knowledge-atlas",
      "label": "性能优化的本质是控制成本发生的频率、时机与范围",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "后续底座校准：指标、采样时窗与历史阈值不能互相替代中的“Android PSS 内存的含义与分析方法”导航项",
      "citation": "https://www.pystone.net/notes/performance-optimization-cost-frequency-scope/#%E5%90%8E%E7%BB%AD%E5%BA%95%E5%BA%A7%E6%A0%A1%E5%87%86%E6%8C%87%E6%A0%87%E9%87%87%E6%A0%B7%E6%97%B6%E7%AA%97%E4%B8%8E%E5%8E%86%E5%8F%B2%E9%98%88%E5%80%BC%E4%B8%8D%E8%83%BD%E4%BA%92%E7%9B%B8%E6%9B%BF%E4%BB%A3"
    },
    {
      "id": "note:game-graphics-and-runtime",
      "title": "游戏图形与运行时",
      "url": "https://www.pystone.net/notes/game-graphics-and-runtime/",
      "atlas": "https://www.pystone.net/?node=game-graphics-and-runtime#knowledge-atlas",
      "label": "游戏图形与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "Unity中的“【内存】PSS内存组成”导航项",
      "citation": "https://www.pystone.net/notes/game-graphics-and-runtime/#unity"
    }
  ],
  "contentMarkdown": "# Android PSS 内存的含义与分析方法\n\n> [!note] 通用化说明\n> 原笔记中的项目截图已移入私有工作资料。本文不使用固定“合格线”，因为内存预算必须结合设备、系统版本、进程模型和业务场景确定。\n\n## PSS 是什么\n\nPSS（Proportional Set Size，按比例分摊集）用于估算一个进程应承担的物理内存：私有页全部计入，共享页按共享进程数近似分摊。它比简单相加 RSS 更适合比较进程的总体内存压力，但仍是一次采样结果，不等于进程独占内存，也不能单独证明发生泄漏。\n\nAndroid 的内存报告常见分类包括：\n\n- **Java/Kotlin Heap**：ART 管理的对象。\n- **Native Heap**：原生分配器管理的内存。\n- **Code**：可执行文件、共享库、DEX/OAT 等映射。\n- **Stack**：线程栈。\n- **Graphics**：图形缓冲和驱动相关分配；不同系统版本的归类可能变化。\n- **Private Other / System / Unknown**：无法归入上述类别或由系统按其他口径统计的内存。\n\nPrivate Dirty、Private Clean、Shared Dirty、Shared Clean 描述页面的共享性与是否被修改；它们不是“好/坏”的标签，需要结合映射来源和变化趋势解释。\n\n## 采样\n\n```bash\nadb shell dumpsys meminfo <package-name>\nadb shell dumpsys meminfo --local <package-name>\n```\n\n必要时结合以下信息：\n\n- Unity Profiler 或 Memory Profiler 中的托管堆、原生对象与纹理等分类；\n- Perfetto、Android Studio Memory Profiler 或 heapprofd；\n- `/proc/<pid>/smaps` 或系统提供的等价明细；\n- 场景、设备、系统版本、构建配置和采样时间。\n\n## 可复现的分析流程\n\n1. **定义场景**：冷启动、登录、进入关卡、反复切换、退回大厅等。\n2. **控制变量**：固定设备、构建、画质、资源包和操作脚本。\n3. **建立基线**：在相同时间点采样多次，记录中位数和波动范围。\n4. **观察趋势**：完成一轮操作并回到稳定状态，判断 PSS 与各分类是否持续抬升。\n5. **交叉验证**：用对象快照、分配调用栈或映射明细定位增长来源。\n6. **验证释放**：触发资源卸载、场景切换或 GC 后复测；注意分配器保留内存不等于仍有可达对象。\n\n## 避免常见误判\n\n- 一次 PSS 变大不等于泄漏，缓存、资源预热和分配器扩容都可能造成增长。\n- Java/Native/Graphics 的分类不能直接映射为 Unity 的 Managed/Native 分类。\n- 系统回收压力、后台进程和驱动会影响结果，跨设备绝对值不可直接横比。\n- “回不到启动值”不是充分证据；应寻找多轮操作后单调增长且无法解释的保留对象或映射。\n\n## 参考资料\n\n- [Android Developers：内存管理概览](https://developer.android.com/topic/performance/memory-overview)\n- [Android Developers：游戏性能工具](https://developer.android.com/games/tools)\n"
}
