内存泄漏:lowmemory 相关调试
有时应用程序会遇到lowmemory被杀掉的情况。(logcat 打印)
1. 使用 procrank 查看进程的内存
----------------------------------------------------------------------------------------------------------
每个进程占用内存大小以 VSS, RSS , PSS, USS 的形式列出。
VSS :是单个进程全部可访问的地址空间。( 等同于 ps 命令列出的 VSZ)
其大小包括可能还尚未在内存中驻留的部分。比如地址空间已经被 malloc 分配,但是还没有实际写入。
对于确定单个进程实际内存使用大小, VSS 用处不大。
RSS:是单个进程实际占用的内存大小。
(易被误导的原因是, 它包括了该进程使用的所有共享库的内存大小,但对于单个共享库, 尽管无论多少
个进程使用,实际该共享库只会被装入内存一次,如果都算在一个进程的头上有点不公平)
对于单个进程的内存使用大小, RSS 不是一个精确的描述。
PSS:不同于RSS,它只是按比例包含其所使用的共享库大小。
例如, 三个进程使用同一个30 内存页的共享库。 对于三个进程中的任何一个,PSS 将只包括 10 个内存页。
PSS 是一个非常有用的数字,相对合理的进程使用数据。
如果一个进程被终止, 其PSS 将会重新按比例分配给剩下的仍在运行并且仍在使用该共享库的进程。
USS: 单个进程的全部私有内存大小。亦即全部被该进程独占的内存大小。
USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。
如果进程被终止, USS 就是实际被返还给系统的内存大小。
USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字 , 需要重点关注。
----------------------------------------------------------------------------------------------------------
RAM: 524288K total, 32068K free, 3428K buffers, 198128K cached, 220K shmem, 21892K slab
2. dumpsys meminfo <pid> (android 系统分析)--后续继续分析
ethan@PCethan:~/Desktop/test$ adb shell dumpsys meminfo 1807
Applications Memory Usage (kB):
Uptime: 10738523 Realtime: 10738523
** MEMINFO in pid 1807 [com.android.deskclock] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 879 744 0 0 4096 3021 1074
Dalvik Heap 1722 1636 0 0 4300 3354 946
Dalvik Other 204 204 0 0
Stack 64 64 0 0
Other dev 4 0 4 0
.so mmap 495 232 8 16
.apk mmap 418 0 0 0
.dex mmap 492 4 488 0
.oat mmap 414 0 64 0
.art mmap 1693 888 316 0
Other mmap 11 8 0 0
Unknown 142 140 0 12
TOTAL 6538 3920 880 28 8396 6375 2020
App Summary
Pss(KB)
------
Java Heap: 2840
Native Heap: 744
Code: 796
Stack: 64
Graphics: 0
Private Other: 356
System: 1738
TOTAL: 6538 TOTAL SWAP (KB): 28
Objects
Views: 0 ViewRootImpl: 0
AppContexts: 1 Activities: 0
Assets: 2 AssetManagers: 2
Local Binders: 3 Proxy Binders: 8
Parcel memory: 2 Parcel count: 8
Death Recipients: 0 OpenSSL Sockets: 0
SQL
MEMORY_USED: 0
PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0
通常有确定是哪个进程的时候 ,可以通过 dumpsys meminfo xx_pid 来获取信息
重点查看android 进程的 heap 分配情况,是否有增大的情况。
3. show map -a [pid] 用于查看虚拟地址区域的内存情况
4. cat /proc/meminfo 能否查看更加详细的内存信息
5. free 命令
6. showmap 命令
7. vmstat 命令
参数列总共15个参数,分为4大类:
procs(进程)----------------------------------------------------------------------------------------------
r: Running队列中进程数量
b: IO wait的进程数量
memory(内存)------------------------------------------------------------------------------------------
free: 可用内存大小
mapped:mmap映射的内存大小
anon: 匿名内存大小
slab: slab的内存大小
system(系统)-------------------------------------------------------------------------------------------
in: 每秒的中断次数(包括时钟中断)
cs: 每秒上下文切换的次数
cpu(处理器)---------------------------------------------------------------------------------------------
us: user time , ni: nice time ,sy: system time,id: idle time, wa: iowait time, ir: interrupt time
小结:
dumpsys meminfo适用场景: 查看进程的oom adj,或者dalvik/native等区域内存情况,
或者某个进程或apk的内存情况,功能非常强大;
procrank适用场景: 查看进程的VSS/RSS/PSS/USS各个内存指标;
cat /proc/meminfo适用场景: 查看系统的详尽内存信息,包含内核情况;
free适用场景: 只查看系统的可用内存;
showmap适用场景: 查看进程的虚拟地址空间的内存分配情况;
vmstat适用场景: 周期性地打印出进程运行队列、系统切换、CPU时间占比等情况;