zoukankan      html  css  js  c++  java
  • 内存泄漏: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时间占比等情况;

     

     

  • 相关阅读:
    Countly在andoid和vps集成使用,开源的统计分析sdk
    简单dp-poj-2231-Moo Volume
    Head First设计模式-观察者模式
    D3D游戏编程系列(六):自己动手编写第一人称射击游戏之第一人称视角的构建
    面试之BI-SQL--table转换[2]
    oracle表数据误删还原
    SQL Server 2008数据库创建,备份,还原图解及注意点
    SHH入门:Spring框架简介
    基于总变差模型的纹理图像中图像主结构的提取方法。
    windows程序员进阶系列:《软件调试》之堆 (一)
  • 原文地址:https://www.cnblogs.com/zhangyin-ethan/p/7490564.html
Copyright © 2011-2022 走看看