内存泄漏: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时间占比等情况;

 

 

原文地址:https://www.cnblogs.com/zhangyin-ethan/p/7490564.html