前言
内存优化作为Android性能优化中非常重要的一环,这篇blog主要记录了跟内存优化相关的重要命令、核心指标、相关原理的解析。作为前置知识,起到奠基的作用。阅读完本篇内容,你将对于Android的内存优化有个大致的知识框架。更加详细的解析,会在后续blog中更新。
内存核心指标
Android有一个名为procrank(/system/xbin/procrank)的工具,它按照从最高到最低的顺序列出Linux进程的内存使用情况。报告的大小包括VSS、RSS、PSS和USS等。
为了简化描述,内存将以页面而不是字节的形式表示。我们的Linux系统在最低级别以4096字节的页面管理内存。
总体而言他们的定义如下:
VSS(Virtual Set Size)
虚拟耗用的内存(包含与其他进程共享占用的虚拟内存)。
VSS是进程的总可访问地址空间。该大小还包括可能尚未写入的内存,例如已分配但尚未写入的malloc。VSS对于确定进程的真实内存使用几乎没有用处。
RSS(Resident Set Size )
实际使用的物理内存(包含与其他进程共享占用的内存)
RSS表示一个进程在RAM中实际拥有的总内存。RSS可能具有误导性,因为它包括了该进程与其他进程共享的实际物理内存使用量,例如,对于共享库,其往往只加载到内存中一次,而不管有多少进程使用它。RSS不能准确地表示单个进程的内存使用情况。
PSS(Proportional Set Size)
实际使用的物理内存(按比例包含与其他进程共享占用的内存)
PSS与RSS不同之处是,对于进程间共享的内存,其按比例报告其所使用的共享物理内存大小。
比如有n个进程同时在使用一个共享库,那对于单个进程,其占用的该共享库的内存为1/n。如果三个进程都使用一个有30页的共享库,那么这个库将只向每个进程报告的PSS贡献10页。
PSS是一个非常有用的数字,因为当系统中所有进程的PSS加在一起时,就可以很好地表示系统中总的内存使用量。
当一个进程被终止时,贡献给它的PSS的共享库将按比例分配给仍然使用该库的其他进程的PSS总数。这样,PSS可能有点误导人,因为当进程被终止时,PSS不能准确地表示返回到整个系统的内存。
PSS和RSS的区别
PSS与RSS不同之处在于,它报告了其共享库的比例大小。例如,如果三个进程都使用一个有30页的共享库,那么该库将只为每个进程报告的PSS贡献10页。
USS (Unique Set Size)
进程独自占用的物理内存(不包含与其他进程共享占用的内存)
USS表示进程占用的总的物理的存大小,也就是说这部分内存是该进程完全独占的。USS是一个非常有用的数字,因为它表示运行特定进程的实际增量成本。当进程被终止时,USS是实际返回给条统的总内存。
当最初怀疑某个进程存在内存泄漏时,USS是最好的监视数字。
Python有个很好的工具叫做smem,它可以输出包括所有这些类别的内存统计信息。
对于单个进程,一般来说内存占用大小排序如下:VSS>=RSS>=PSS >= USS
adb shell
adb shell getprop ro.product.model
获取设备型号
adb shell dumpsys battery
获取设备电池信息
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
Max charging current: 0
Max charging voltage: 0
Charge counter: 4120000
status: 4
health: 2
present: true
level: 80
scale: 100
voltage: 3978
temperature: 380
technology: Li-ion
adb shell wm size
物理屏幕分辨率
Physical size: 600x1024
adb shell wm density
屏幕像素密度
Physical density: 240
adb shell dumpsys window displays
日志太长,影响篇幅,就不贴上来了。这个命令总体可以提供的信息有:
- 屏幕分辨率和密度。
- 显示的屏幕方向。
- 系统中所有窗口的状态,包括它们的标识符、大小、位置等。
- 当前活动窗口和焦点窗口的信息。
- 显示器的物理尺寸和显示密度。
- 前台应用程序的详细信息。
adb shell cat /proc/cpuinfo
提供cpu的信息
参考:https://developer.android.com/tools/adb?hl=zh-cn
内存分析命令
cat /system/build.prop
这个命令,我在实际运行的时候,被拒绝了。也许是需要root权限。
它能提供的信息:
设备的型号和制造商。
Android 系统的版本号。
系统的构建日期和时间戳。
系统的一些配置参数,比如默认语言、地区、时区等。
硬件配置信息,如屏幕密度、处理器架构、内存大小等。
dumpsys meminfo:
这个命令用于在Android系统中获取内存信息。它提供了有关系统中内存使用情况的详细信息,包括各个进程的内存使用情况、缓存和缓冲区的使用情况等。通过分析这些信息,可以了解系统中内存的分配情况,以及可能存在的内存泄漏或性能问题。
Q10A:/ $ dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 126311204 Realtime: 126311204
Total PSS by process:
80,347K: system (pid 2353)
51,351K: com.android.systemui (pid 2606 / activities)
39,563K: com.pax.usbcommdemo (pid 3989 / activities)
34,159K: com.pax.security (pid 5104 / activities)
31,535K: com.android.launcher3 (pid 2887 / activities)
25,687K: com.android.settings (pid 2723)
23,025K: zygote (pid 2054)
22,616K: com.pax.daemon (pid 3118)
15,588K: surfaceflinger (pid 2081)
13,907K: com.android.inputmethod.latin (pid 2847)
10,608K: android.process.media (pid 3261)
10,300K: media.swcodec (pid 2147)
9,541K: com.paxdroid.osmanager (pid 3139)
9,423K: com.android.permissioncontroller (pid 3741)
9,037K: com.android.traceur (pid 3777)
8,934K: audioserver (pid 2078)
8,749K: com.pax.ipp.neptune (pid 3652)
8,362K: com.paxdroid.verify (pid 2789)
8,357K: com.android.managedprovisioning (pid 3673)
8,178K: mediaserver (pid 2136)
7,869K: com.pax.rki (pid 3310)
7,479K: com.android.keychain (pid 3375)
7,309K: com.android.packageinstaller (pid 3719)
7,303K: media.codec (pid 2140