命令
- 查看系统内存状态
cat /proc/meminfo
adb shell procrank (pid)
adb shell dumpsys meminfo/cpuinfo <package_name>/pid内查看本地层程序
top -t -m 5 -n 2 查询Cpu/内存的基本使用
adb shell cat /proc/buddyinfo
adb shell cat /proc/meminfo // 查看更加详细的内存信息
adb shell cat /proc/pid/maps- 查看内存碎片状态
cat /proc/pagetypeinfo- 查看应用的graphic缓存(如纹理缓存)
dumpsys gfxinfo- 查看进程内的位图
dumpsys gfxinfo [pid] -b- 查看lowmemorykiller阈值
cat /sys/module/lowmemorykiller/parameters/minfree
cat /sys/module/lowmemorykiller/parameters/adj- 查看ion buffer使用情况,比如起camera的时候会有大量的ion使用
cat /d/ion/heaps/system- App进程分配到的最大内存
adb shell getprop | grep dalvik.vm.heapsize
- dumpsys meminfo
查看进程的oom adj,或者dalvik/native等区域内存情况,或者某个进程或apk的内存情况
dumpsys meminfo // 输出指定pid的某一进程
dumpsys meminfo --package // 输出指定包名的进程,可能包含多个进程
adb shell dumpsys meminfo 包名
- Pss: 该进程独占的内存+与其他进程共享的内存(按比例分配,比如与其他3个进程共享9K内存,则这部分为3K)
- Privete Dirty:该进程独享内存
- Heap Size:分配的内存
- Heap Alloc:已使用的内存
- Heap Free:空闲内存
- procrank
procrank命令比dumpsys meminfo命令,能输出更详细的VSS/RSS/PSS/USS内存指标。
- 最后一行输出下面6个指标
total free buffers cached shmem slab
VSS是单个进程全部可访问的地址空间,其大小可能包括还尚未在内存中驻留的部分。对于确定单个进程实际内存使用大小,VSS用处不大。
RSS是单个进程实际占用的内存大小,RSS不太准确的地方在于它包括该进程所使用共享库全部内存大小。对于一个共享库,可能被多个进程使用,实际该共享库只会被装入内存一次。进而引出了PSS,PSS相对于RSS计算共享库内存大小是按比例的。N个进程共享,该库对PSS大小的贡献只有1/N。
USS:Unique Set Size 进程独自占用的物理内存,不包含与其他进程共享占用的内存。USS去掉的是所有跨进程共享的内存,不是只去掉了共享库
VSS = 虚拟内存,进程独占已分配但未使用内存 + 进程独占已用内存 + 共享内存
RSS = 进程独占已用内存 + 共享内存
PSS = 进程独占已用内存 + 共享内存/n
USS = 进程独占已用内存
dumpsys meminfo 使用的都是PSS
- cat /proc/meminfo
查看系统的详尽内存信息,包含内核情况
root@phone:/ # cat /proc/meminfo
MemTotal: 2857.032 kB //RAM可用的总大小 (即物理总内存减去系统预留和内核二进制代码大小)
MemFree: 1020.708 kB //RAM未使用的大小
Buffers: 75.104 kB //用于文件缓冲
Cached: 448.244 kB //用于高速缓存
SwapCached: 0 kB //用于swap缓存
Active: 832.900 kB //活跃使用状态,记录最近使用过的内存,通常不回收用于其它目的
Inactive: 391.128 kB //非活跃使用状态,记录最近并没有使用过的内存,能够被回收用于其他目的
Active(anon): 700.744 kB //Active = Active(anon) + Active(file)
Inactive(anon): 228 kB //Inactive = Inactive(anon) + Inactive(file)
Active(file): 132.156 kB
Inactive(file): 390.900 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 524.284 kB //swap总大小
SwapFree: 524.284 kB //swap可用大小
Dirty: 0 kB //等待往磁盘回写的大小
Writeback: 0 kB //正在往磁盘回写的大小
AnonPages: 700.700 kB //匿名页,用户空间的页表,没有对应的文件
Mapped: 187.096 kB //文件通过mmap分配的内存,用于map设备、文件或者库
Shmem: .312 kB
Slab: 91.276 kB //kernel数据结构的缓存大小,Slab=SReclaimable+SUnreclaim
SReclaimable: 32.484 kB //可回收的slab的大小
SUnreclaim: 58.792 kB //不可回收slab的大小
KernelStack: 25.024 kB
PageTables: 23.752 kB //以最低的页表级
NFS_Unstable: 0 kB //不稳定页表的大小
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1952.800 kB
Committed_AS: 82204.348 kB //评估完成的工作量,代表最糟糕case下的值,该值也包含swap内存
VmallocTotal: 251658.176 kB //总分配的虚拟地址空间
VmallocUsed: 166.648 kB //已使用的虚拟地址空间
VmallocChunk: 251398.700 kB //虚拟地址空间可用的最大连续内存块
对于cache和buffer也是系统可以使用的内存。所以系统总的可用内存为 MemFree+Buffers+Cached
- showmap
用于查看虚拟地址区域的内存情况
showmap -a [pid]
功能与cat /proc/[pid]/maps基本一致
该命令的输出每一行代表一个虚拟地址区域(vm area)
- 解释
start addr和end addr:分别代表进程空间的起止虚拟地址;
virtual size/ RSS /PSS这些前面介绍过;
shared clean:代表多个进程的虚拟地址可指向这块物理空间,即有多少个进程共享这个库;
shared: 共享数据
private: 该进程私有数据
clean: 干净数据,是指该内存数据与disk数据一致,当内存紧张时,可直接释放内存,不需要回写到disk
dirty: 脏数据,与dis