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

     

     

  • 相关阅读:
    Linux systemctl 命令完全指南
    分享一些 Kafka 消费数据的小经验
    大数据日志采集系统
    使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus
    这可能是最为详细的Docker入门吐血总结
    用不用lambda,这是一个问题
    es上的的Watcher示例
    Elasticsearch6.5.2 X-pack破解及安装教程
    oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置
    Apache Beam实战指南 | 手把手教你玩转大数据存储HdfsIO
  • 原文地址:https://www.cnblogs.com/zhangyin-ethan/p/7490564.html
Copyright © 2020-2023  润新知