通过 adb 检查 Android 内存


使用Unity3d的Profiler可以查看Unity3d项目使用的内存。对于IOS有Instruments来查看内存状况,对于 Android内存 也是有adb工具可以查看的。不过数据似乎不那么明朗,本文介绍了Android内存分布的基本指标,并介绍三种方法来查看内存,欲知具体如何,且听我细细道来。

ADB shell

当adb能链接到手机上时,使用adb shell可进入手机的内核系统。由于Android底层是Linux,所以它的指令集是Linux的。

Android内存 分配概念

  1. VSS ( Virtual Set Size) 是单个进程全部可访问的地址空间。
    其大小包括可能还尚未在内存中驻留的部分。比如地址空间已经被 malloc 分配,但是还没有实际写入。

  2. RSS (Resident Set Size) 是单个进程实际占用的内存大小。
    RSS 易被误导的原因在于,它包括了该进程所使用的所有共享库的全部内存大小。对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。

  3. PSS (Proportional Set Size)不同于RSS,它只是按比例包含其所使用的共享库大小。
    例如, 三个进程使用同一个占用 30 内存页的共享库。 对于三个进程中的任何一个,PSS 将只包括 10 个内存页。
    PSS 是一个非常有用的数字,因为系统中全部进程以整体的方式被统计, 对于系统中的整体内存使用是一个很好的描述。
    如果一个进程被终止, 其PSS 中所使用的共享库大小将会重新按比例分配给剩下的仍在运行并且仍在使用该共享库的进程。
    此种计算方式有轻微的误差,因为当某个进程中止的时候, PSS 没有精确的表示被返还给整个系统的内存大小。

  4. USS (Unique Set Size)是单个进程的全部私有内存大小。亦即全部被该进程独占的内存大小。
    USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。
    如果进程被终止, USS 就是实际被返还给系统的内存大小。
    USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加。

简单来说:

  • VSS通常不关注
  • RSS:进程实际占用的物理内存加上所有(其他进程,比如Settings进程…)共享库占用的内存
  • PSS:进程实际占用的物理内存加上自己进程的共享库占用的内存
  • USS:进程实际占用的物理内存

一般来说 Android内存 占用大小有如下规律:VSS >= RSS >= PSS >= USS。实际在统计查看某个进程内存占用情况的时候,看PSS是比较客观的,而USS是结束进程会返还给系统的内存。

Android内存 占用查看

通常来说有以下几种方法查看内存:

Top

通过linux中的性能查看函数可以实时看到动态的Rss数量。虽然直接参考意义不大,但如果同时参考它与PSS的差值,则可以动态查看内存变化。我有时也用它来查看包名和PID。

dumpsys meminfo

这是Android提供的命令工具,通过它可以对内存进行快照。其中包括PSS数据:

除开PSS,私有内存也有参考价值,它是进程独占的内存。也就是应用进程销毁时系统可以直接回收的内存容量。

通常来说,private dirty内存是其最重要的部分,因为只被自己的进程使用。它只在内存中存储,因此不能做分页存储到外存(Android不支持swap)。通常来说,只需关心Pss Total列和Private Dirty列就可以了。我觉得USSPrivate Dirty应该很相近。

procrank

这个命令可以提供上面提到的四种数据,但它的统计方式和dumpsys meminfo不同,听说这个命令不太准,我实测它的值比较大。不是所有的Android手机都有这个命令,如果没有需要安装。我比较烦安卓各种权限验证,所以就手动把文件复制到sd卡上,然后移动到对应目录中。

配置完成后,在root模式下可以使用procrank查看内存信息。

总结

通过以上三种方法可以从各个侧面考察自己的应用对 Android内存 的占用情况。不过优化Unity制作的程序还是通过Profiler更方便一些。

 

本文出自 松阳论道 转载必须注明出处

http://blog.songyang.net/306.html

说点什么吧...

电子邮件地址不会被公开。 必填项已用*标注