一、概述

记录一些分析Android/Linux进程的内存占用、内存布局、内存空间结构的一些分析工具和方法。

1.1 内存指标概念

Item全称含义等价
USSUnique Set Size物理内存进程独占的内存
PSSProportional Set Size物理内存PSS= USS+ 按比例包含共享库
RSSResident Set Size物理内存RSS= USS+ 包含共享库
VSSVirtual Set Size虚拟内存VSS= RSS+ 未分配实际物理内存
  • VSS >= RSS >= PSS >= USS

1.2 内存分析命令

常用的内存调优分析命令:

工具 描述
top/htop 最简单也是最粗略的工具,初步展示内存占用情况
vmstat 除了展示内存外,还展示io、CPU等
cat /proc/meminfo 查看系统全局内存统计
free /proc/meminfo的精简版,粗略查看内存总体情况
procrank 可以查看所有进程的VSS PSS RSS USS
dumpsys meminfo 可以查看进程PSS,提供oom killer的排序;可以查看系统全局,可以查看指定包;查看指定包时可以查看不同分类的内存,尤其是Java虚拟机(Android App)的进程可以看到Heap、Code、mmap、GFX、Native等各部分占用的内存
cat /proc/{$PID}/maps 查看对应进程的虚拟内存映射空间;可以查看进程空间的结构、各部分地址空间的详细使用情况
cat /proc/{$PID}/smaps maps的详细版
cat /proc/{$PID}/statm 输出对应进程的内存信息,但是以页为单位
showmap 基于maps和smaps做的一个统计和展示
procmem 和showmap差不多,也是对某个进程查看详细内存结构
Profiler 查看Java部分的内存,包括Heap、stack、code、mmap、Native的内存,提供Heap Profile能力

小结

  1. 查看Android App的详细内存占用,使用dumpsys meminfoProfiler可以查看详细的不同区域的内存使用情况;结合cat /proc/{$PID}/maps(或者是基于它的工具如showmapprocmem)查看Linux级别的详细的内存布局,可以分析Android进程加载了哪些so、dex等,查看不同的内存区域。
  2. 粗略查看系统全局的内存,可以使用freetopvmstatcat /proc/meminfo
  3. 查看单个进程的总体内存占用,使用procrank