4、内存占用获取

4.1 当前内存使用情况

内存使用情况也是老生常谈的问题了,网上有很多资料,在此简单重温一遍。

方案一:cat /proc/meminfo

/proc/meminfo展示了系统内存使用情况,其中有两个关键指标:

  1. MemTotal:代表系统总内存大小,单位是KB
  2. MemFree:代表系统当前可用内存大小,单位是KB 在apk执行cat指令读取该文件可以获取到目标数值,无论是效率还是适用性都很高。

image.png

方案二:dumpsys meminfo

dumpsys meminfo + [pkg]通常用来查看指定进程包名的内存使用情况,如果不加包名,可以得到当前内存总量和可使用内存量,其中:

  • Total RAM:内存总量
  • Free RAM:可使用内存量

image.png

然而dumpsys meminfo耗时达到秒级,耗时较久,效率不高。

方案三:free

使用free命令可以查看系统当前内存使用情况,其中有两个关键数据:

  • total:总内存大小
  • used:已使用的大小

image.png

虽然也满足需求,但本方案和方案一和二,都是通过执行shell指令获取一串数据,因此需要对数据加以解析才能得到目标数据,在方案实现上稍微麻烦一点。

方案四:MemoryInfo 获取

ActivityManager服务是对Activity管理、运行时功能管理和运行时数据结构的封装,进程、应用程序、服务、任务信息等。通过 ActivityManager 获取到的 MemoryInfo 是整个设备的内存信息,主要包括:

  • totalMem:内核可访问的总内存。
  • availMem:系统上的可用内存。
  • lowMemory:如果系统认为自己当前处于低内存状况,则设置为True。
  • threshold:系统认为内存较低并开始杀死后台服务和其他非外部进程的可用阈值。
val memoryInfo = ActivityManager.MemoryInfo()
mActivityManager.getMemoryInfo(memoryInfo)
totalMemory = memoryInfo.totalMem
availMemroy = memoryInfo.availMem

该方案是针对应用层获取系统内存信息的API函数,在应用层获取内存信息,推荐使用该方案。

结论

获取内存使用情况的方法 效率 实现难度 推荐
dumpsys meminfo
cat /proc/meminfo
free
MemoryInfo 获取

4.2 内存使用率TOP5进程获取

前文获取了实时CPU使用率最高的5个进程,那么实时占用内存最高的5个进程也有必要获取。在获取指标之前,我们先来了解几个名词:

  • RSS:(Resident Set Size)实际使用物理内存(包含共享库占用的内存)。RSS可能具有误导性,因为它包括了该进程与其他进程共享的实际物理内存使用量,例如,对于共享库,其往往只加载到内存中一次,而不管有多少进程使用它。因此RSS不能准确地表示单个进程的内存使用情况。
  • PSS:(Proportional Set Size)实际使用的物理内存(比例分配共享库占用的内存),比如2个进程使用10KB的共享库,那么每个进程算5KB内存占用到PSS中。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
  • VSS:(Virtual Set Size) 虚拟耗用内存(包含共享库占用的内存).表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
  • USS: (Unique Set Size) 进程独自占用的物理内存(不包含共享库占用的内存),表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!

方案一:top指令

又是强大的top指令,可以查到每个进程占用的内存率,我们在man手册查看top指令,可以这样的描述:“ %MEM -- Memory Usage (RES):A task's currently used share of available physical memory.”,符合我们的需求。如果是一般情况下,推荐使用top指令获取进程相关数据,但用于性能监控程序,top指令还是太耗时了。

方案二:procrank指令

procrank是一个统计内存使用的神器,可以获取上述VSS,PSS,PSS和USS的详细参数,是一个分析内存使用非常有用的工具。然而计算出如此详细的参数自然需要较长的时间,因此在这里并不是最优解。

 PID       Vss      Rss      Pss      Uss     Swap    PSwap    USwap    ZSwap  cmdline
 1894  8866976K  262320K  119897K  109052K    3336K      58K       0K      11K  com.launcher
 3479  7979016K  251528K  118276K  109140K   65728K    7437K       0K    1474K  com.guide
  945  8659104K  278584K  117064K