【Android系统内存详细分析与理解】

目录

1. 主要内存项

1.1 VSS(虚拟内存 Virtual Set Size)

1.2 RSS(常驻内存 Resident Set Size)

1.3 PSS(比例驻留内存 Proportional Set Size)

1.4 USS(独占驻留内存 Unique Set Size)

2. 其他内存项

3.内存指标选择

4. 重点总结


在 Android 中,dumpsys meminfo 或其他内存分析工具(如 adb shell cat /proc/PID/smaps)提供了多个 内存使用指标,常见的包括 VSS、RSS、PSS、USS 等。

1. 主要内存项

缩写

全称

含义

VSS

Virtual Set Size (虚拟集大小)

进程分配的全部虚拟地址空间,包括未实际使用的部分。

RSS

Resident Set Size (常驻集大小)

进程实际驻留在RAM中的物理内存(包括共享内存)。

PSS

Proportional Set Size (比例集大小)

进程实际使用的物理内存,按共享内存按比例分摊计算。

USS

Unique Set Size (独占集大小)

进程独占使用的物理内存,不包含共享部分。

1.1 VSS(虚拟内存 Virtual Set Size)

概念:进程申请的 所有虚拟地址空间,它是一个进程能访问的所有内存空间地址的大小,包括:

  • 实际使用的物理内存
  • 未映射到 RAM 的虚拟内存(如 mmap() 但未写入的页面)
  • 映射的文件(如 SO 库、Dex、映射 I/O)
  • 匿名映射(Anonymous Mapping,如 malloc 分配但未使用的部分)
  • 共享库的映射地址空间

特点:

  • 不能直接表示进程真实的物理内存占用
  • 大多数进程的 VSS 远大于实际物理内存使用
  • 一般不用于衡量内存占用

示例:

adb shell cat /proc/$(pidof com.example.app)/status | grep VmSize

 输出:

VmSize: 1200000 kB

表示该进程 分配了 约 1.2GB 的 虚拟地址空间。

1.2 RSS(常驻内存 Resident Set Size)

概念:进程当前实际驻留 在 RAM 中的物理内存,RSS可能会产生误导,因为它包含了所有该进程使用的共享库所占用的内存,一个被加载到内存中的共享库可能有很多进程会使用它。RSS不是单个进程使用内存量的精确表示包括:

  • 代码段、数据段
  • 共享库映射的内存(但不按比例计算)
  • 未被 swap 出去的部分

特点:

  • 比 VSS 更能反映 进程真实占用的物理内存
  • 但 RSS 计算了全部共享内存,不适用于多进程系统分析
  • 适合评估进程“驻留 RAM” 的情况

示例:

adb shell cat /proc/$(pidof com.example.app)/status | grep VmRSS

输出:

VmRSS: 256000 kB

表示该进程实际驻留在物理 RAM 的大小为 256MB。

1.3 PSS(比例驻留内存 Proportional Set Size)

概念:进程实际占用的物理内存,共享内存按比例分摊:

它会按比例分配共享库所占用的内存。 例如,如果有三个进程共享一个占30页内存控件的共享库,每个进程在计算PSS的时候,只会计算10页。 PSS是一个非常有用的数值,如果系统中所有的进程的PSS相加,所得和即为系统占用内存的总和。当一个 进程被杀死后,它所占用的共享库内存将会被其他仍然使用该共享库的进程所分担。在这种方式下,PSS 也会带来误导,因为当一个进程被杀后,PSS并不代表系统回收的内存大小。

  • 独占的物理内存 100% 计算
  • 共享内存(如共享库)按 多个进程分摊计算

特点:

  • 比 RSS 更精确,适合衡量进程的真实内存占用
  • Android 主要使用 PSS 评估应用占用的内存
  • 比 USS 更准确,避免了忽略共享内存的误差

示例:

adb shell dumpsys meminfo <package_name>

输出:

PSS TOTAL: 128000 kB

表示该进程 真实占用 RAM 为 128MB(已考虑共享内存)。

1.4 USS(独占驻留内存 Unique Set Size)

概念:进程 独占的物理内存,不包含共享内存。USS是一个非常有用的数值,因为它表明了运行一个特定进程所需的真正内存成本。当一个进程被杀死,USS就是所有系统回收的内存。USS是用来检查进程中是否有内存泄露的最好选择。

特点:

  • 适用于分析进程独占的 RAM 需求
  • 但可能低估真实占用(忽略共享库的影响)
  • 不适合评估整个系统的内存占用

示例

adb shell procrank

输出:

   PID       Vss          Rss          Pss        Uss

12345 1000000K 250000K 130000K 90000K

其中 USS=90MB,表示该进程 独占 90MB 物理 RAM。

2. 其他内存项

名称

含义

SwapPss

进程在swap(交换分区)中的占用(按 PSS 分摊计算)。

Heap Size

进程的 Java/Kotlin堆大小(Heap Size)。

Heap Alloc

已分配的 Java/Kotlin 堆内存。

Heap Free

未使用的 Java/Kotlin 堆内存。

Dalvik Heap

Dalvik 虚拟机(ART)内存。

Native Heap

C/C++ 代码的 native heap 内存(malloc/new)。

Graphics

GPU 显存(OpenGL/渲染缓存)。

Ashmem

Android 共享内存区域(Anonymous Shared Memory)。

3.内存指标选择

用途

推荐指标

原因

分析进程的真实内存占用

PSS 

共享内存按比例分摊,反映真实占用

分析进程的独占 RAM

USS 

仅计算进程独占的物理内存

分析系统 RAM 驻留情况

RSS 

包括进程的全部驻留内存

分析进程虚拟内存

VSS 

了解进程地址空间大小(但不等于物理占用)

查找内存泄漏

Heap Size / Alloc 

分析 Java Heap、Native Heap


4. 重点总结

  • VSS:分配的虚拟内存(误导性大)。
  • RSS:驻留 RAM(包含共享内存)。
  • PSS:推荐,真实占用(共享内存按比例分摊)。
  • USS:进程独占 RAM(不计算共享部分)。

如果你要分析 Android 算法的内存占用,建议主要关注:

  • PSS(进程真实占用)
  • USS(进程独占部分)
  • Native Heap(C++ 代码占用)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值