获取: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 虚拟耗用内存(包含共享库占用的内存)
- PSS - Proportionnal Set Size
实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)。例如,如果有三个进程都使用了一个共享库,共占用三十页内存。那么PSS将认为每个进程分别占用改共享库十页的大小。PSS是非常有用的数据,因为系统中所有进程的PSS相加的话,就刚好反映了系统中的总共占用的内存。而当一个进程别销毁之后,其占用的共享库那部分比例的PSS,将会再次按比例分配给余下使用该库的进程。这样PSS可能会造成一些误导,因为当一个进程销毁的后,PSS不能准确的表示返回给全局系统的内存。
- USS - Unique Set Size(非常有用)
进程独自占用的物理内存(不包含共享库占用的内存)。USS是非常有用的数据,因为它反映了运行一个特定进程真实的边际成本(增量成本)。当一个进程被销毁后,USS是真实返回给系统的内存。当进程中存在一个可疑的内存泄漏时,USS是最佳观察数据。
- RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
实际使用物理内存(包含共享库占用的全部内存)。但是RSS还是可能会造成误导,因为它仅仅表示该进程所使用的所有共享库的大小,它不管有多少个进程使用该共享库,该共享库仅被加载到内存一次。所以RSS并不能准确反映单进程的内存占用情况。
- ps :使用Android studio 的 profiler 看到的RSS
额外收获
- 在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk,mmap,munmap这些系统调用实现的。
情况一、malloc小于128k的内存,使用brk分配内存,将_edata往高地址推(只分配虚拟空间,不对应物理内存(因此没有初始化),
第一次读/写数据时,引起内核缺页中断,内核才分配对应的物理内存,然后虚拟地址空间建立映射关系)
情况二、malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配(对应独立内存,而且初始化为0)
* 晓得了malloc的实现