Android内存之VSS/RSS/PSS/USS

2,205 阅读3分钟

获取:RSS/PSS

  • NOTE:

    • 一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
    • 实际在统计查看某个进程内存占用情况的时候,看PSS是比较客观的
    • VSS 需要root ,adb 目前拿不到;
  • 使用命令

    adb shell dumpsys procstats --hours 3 com.jar.new // 后面是应用包名

  • 得到的log,过滤一下,参考官网

 PSS、USS 和 RSS(`minPSS-avgPSS-maxPSS/minUSS-avgUSS-maxUSS/minRSS-avgRSS-maxRSS` over 样本数)
 TOTAL: 40% (264MB-317MB-333MB/237MB-291MB-307MB/390MB-456MB-477MB over 7)
  • 可以看出

    • PSS :264MB
    • USS :317MB
    • RSS :333MB

名词解释

  • VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

Vss.png

  • PSS - Proportionnal Set Size

实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)。例如,如果有三个进程都使用了一个共享库,共占用三十页内存。那么PSS将认为每个进程分别占用改共享库十页的大小。PSS是非常有用的数据,因为系统中所有进程的PSS相加的话,就刚好反映了系统中的总共占用的内存。而当一个进程别销毁之后,其占用的共享库那部分比例的PSS,将会再次按比例分配给余下使用该库的进程。这样PSS可能会造成一些误导,因为当一个进程销毁的后,PSS不能准确的表示返回给全局系统的内存。

PSS.png

  • USS - Unique Set Size(非常有用)

进程独自占用的物理内存(不包含共享库占用的内存)。USS是非常有用的数据,因为它反映了运行一个特定进程真实的边际成本(增量成本)。当一个进程被销毁后,USS是真实返回给系统的内存。当进程中存在一个可疑的内存泄漏时,USS是最佳观察数据。

USS.png

  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)

实际使用物理内存(包含共享库占用的全部内存)。但是RSS还是可能会造成误导,因为它仅仅表示该进程所使用的所有共享库的大小,它不管有多少个进程使用该共享库,该共享库仅被加载到内存一次。所以RSS并不能准确反映单进程的内存占用情况。

RSS.png

  • ps :使用Android studio 的 profiler 看到的RSS

RSS-2.png

额外收获

  • 在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。

情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),

第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系)

情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)

  * 晓得了malloc的实现

参考