Android内存的相关排查方法

一、dumpsys meminfo命令

dumpsys meminfo 是Android系统提供的查询内存命令,用该命令可以看到:
每个进程占用的物理内存大小
系统内存分布状态,包括
总的可用物理内存 Total RAM
当前可用物理内存 Free RAM
已用物理内存 Used RAM
不可见内存 Lost RAM

比如输入该命令后输出如下日志:

130|root@MR820:# dumpsys meminfo
Applications Memory Usage (kB):
Uptime: 698643 Realtime: 698643
Total PSS by process:
    23437 kB: system (pid 1980)
    21293 kB: com.android.systemui (pid 2139)
    19164 kB: com.android.settings (pid 2660 / activities)
    18460 kB: im.yixin.tv (pid 2300)
    18358 kB: com.fiberhome.iptv (pid 2356 / activities)
    17374 kB: com.example.wd.mylauncher (pid 3035 / activities)
    14480 kB: com.android.smart.tv.cloud189 (pid 2618)
    12488 kB: zygote (pid 1409)
     8324 kB: com.egame.tv (pid 2769)
     7637 kB: com.fiberhome.fhnotice (pid 3065 / activities)
     7215 kB: com.yx.itvhelpself (pid 2883 / activities)
     7083 kB: im.yixin.tv:core (pid 2494)
     7068 kB: com.fh.tr069 (pid 2397)
     6778 kB: com.fiberhome.factoryTest (pid 2371)
     6418 kB: android.process.media (pid 2513)
     6223 kB: com.android.smart.tv.cloud189:upnp (pid 2639)
     6169 kB: android.process.acore (pid 2475)
     5707 kB: com.fiberhome.fhupgrade (pid 2384)
     5101 kB: com.hisilicon.android.hiRMService (pid 2336)
     4804 kB: com.hisilicon.android.inputmethod.remote (pid 2276)
     4576 kB: mediaserver (pid 1411)
     4289 kB: com.android.gallery3d (pid 2977)
     4288 kB: com.hisilicon.dlna.dmr (pid 2322)
     4281 kB: com.android.bluetooth (pid 2714)
     4252 kB: com.hisilicon.dlna.dms (pid 2314)
     4076 kB: tel.gateway (pid 2602)
     3899 kB: com.hisilicon.android.music (pid 2899)
     2888 kB: com.android.keychain (pid 2992)
     2880 kB: com.fh.iptablespatch (pid 2583)
     2860 kB: com.android.defcontainer (pid 2927)
     2855 kB: com.android.musicfx (pid 2954)
     2748 kB: com.android.printspooler (pid 2462)
     2724 kB: com.example.neterrorcodemanagement (pid 2850)
     2506 kB: com.svox.pico (pid 3010)
     2439 kB: com.FHSqmLoader (pid 2411)
     2341 kB: com.hisilicon.uvmos.monitor (pid 2699)
     1540 kB: surfaceflinger (pid 1408)
     1242 kB: hisysmanager (pid 1419)
     1169 kB: drmserver (pid 1410)
     1080 kB: hiaoservice (pid 1417)
      971 kB: sample_ipcfg (pid 1555)
      681 kB: android_ir_user (pid 1425)
      593 kB: netd (pid 1406)
      588 kB: vold (pid 1405)
      550 kB: displaysetting (pid 1421)
      542 kB: frontPanel (pid 1416)
      475 kB: httpd (pid 1583)
      431 kB: keystore (pid 1413)
      421 kB: hikaraokeservice (pid 1420)
      370 kB: netshared (pid 1418)
      345 kB: /init (pid 1)
      304 kB: udhcpc (pid 3726)
      301 kB: configserver (pid 1422)
      297 kB: upgradeserver (pid 1415)
      204 kB: sh (pid 1426)
      203 kB: installd (pid 1412)
      172 kB: sh (pid 3707)
      172 kB: dumpsys (pid 3731)
      167 kB: httpd (pid 1603)
      164 kB: ueventd (pid 1061)
      162 kB: httpd (pid 1604)
      162 kB: httpd (pid 1606)
      162 kB: httpd (pid 1609)
      162 kB: httpd (pid 1610)
      150 kB: debuggerd (pid 1407)
      136 kB: healthd (pid 1403)
      115 kB: servicemanager (pid 1404)

Total PSS by OOM adjustment:
    31095 kB: Native
               12488 kB: zygote (pid 1409)
                4576 kB: mediaserver (pid 1411)
                1540 kB: surfaceflinger (pid 1408)
                1242 kB: hisysmanager (pid 1419)
                1169 kB: drmserver (pid 1410)
                1080 kB: hiaoservice (pid 1417)
                 971 kB: sample_ipcfg (pid 1555)
                 681 kB: android_ir_user (pid 1425)
                 593 kB: netd (pid 1406)
                 588 kB: vold (pid 1405)
                 550 kB: displaysetting (pid 1421)
                 542 kB: frontPanel (pid 1416)
                 475 kB: httpd (pid 1583)
                 431 kB: keystore (pid 1413)
                 421 kB: hikaraokeservice (pid 1420)
                 370 kB: netshared (pid 1418)
                 345 kB: /init (pid 1)
                 304 kB: udhcpc (pid 3726)
                 301 kB: configserver (pid 1422)
                 297 kB: upgradeserver (pid 1415)
                 204 kB: sh (pid 1426)
                 203 kB: installd (pid 1412)
                 172 kB: sh (pid 3707)
                 172 kB: dumpsys (pid 3731)
                 167 kB: httpd (pid 1603)
                 164 kB: ueventd (pid 1061)
                 162 kB: httpd (pid 1604)
                 162 kB: httpd (pid 1606)
                 162 kB: httpd (pid 1609)
                 162 kB: httpd (pid 1610)
                 150 kB: debuggerd (pid 1407)
                 136 kB: healthd (pid 1403)
                 115 kB: servicemanager (pid 1404)
    23437 kB: System
               23437 kB: system (pid 1980)
    98548 kB: Persistent
               21293 kB: com.android.systemui (pid 2139)
               18460 kB: im.yixin.tv (pid 2300)
               18358 kB: com.fiberhome.iptv (pid 2356 / activities)
                7068 kB: com.fh.tr069 (pid 2397)
                6778 kB: com.fiberhome.factoryTest (pid 2371)
                5707 kB: com.fiberhome.fhupgrade (pid 2384)
                5101 kB: com.hisilicon.android.hiRMService (pid 2336)
                4804 kB: com.hisilicon.android.inputmethod.remote (pid 2276)
                4288 kB: com.hisilicon.dlna.dmr (pid 2322)
                4252 kB: com.hisilicon.dlna.dms (pid 2314)
                2439 kB: com.FHSqmLoader (pid 2411)
     7637 kB: Foreground
                7637 kB: com.fiberhome.fhnotice (pid 3065 / activities)
    18579 kB: Visible
                7215 kB: com.yx.itvhelpself (pid 2883 / activities)
                7083 kB: im.yixin.tv:core (pid 2494)
                4281 kB: com.android.bluetooth (pid 2714)
     4076 kB: A Services
                4076 kB: tel.gateway (pid 2602)
     2724 kB: B Services
                2724 kB: com.example.neterrorcodemanagement (pid 2850)
   105418 kB: Cached
               19164 kB: com.android.settings (pid 2660 / activities)
               17374 kB: com.example.wd.mylauncher (pid 3035 / activities)
               14480 kB: com.android.smart.tv.cloud189 (pid 2618)
                8324 kB: com.egame.tv (pid 2769)
                6418 kB: android.process.media (pid 2513)
                6223 kB: com.android.smart.tv.cloud189:upnp (pid 2639)
                6169 kB: android.process.acore (pid 2475)
                4289 kB: com.android.gallery3d (pid 2977)
                3899 kB: com.hisilicon.android.music (pid 2899)
                2888 kB: com.android.keychain (pid 2992)
                2880 kB: com.fh.iptablespatch (pid 2583)
                2860 kB: com.android.defcontainer (pid 2927)
                2855 kB: com.android.musicfx (pid 2954)
                2748 kB: com.android.printspooler (pid 2462)
                2506 kB: com.svox.pico (pid 3010)
                2341 kB: com.hisilicon.uvmos.monitor (pid 2699)

Total PSS by category:
   118323 kB: Dalvik
    45865 kB: .so mmap
    40515 kB: Dalvik Other
    34678 kB: Unknown
    33415 kB: .dex mmap
     6279 kB: .apk mmap
     4224 kB: Stack
     3530 kB: Other mmap
     2039 kB: Native
     1986 kB: .ttf mmap
      340 kB: Other dev
      164 kB: .jar mmap
      152 kB: Ashmem
        4 kB: Cursor
        0 kB: code mmap
        0 kB: image mmap
        0 kB: Graphics
        0 kB: GL
        0 kB: Memtrack

Total RAM: 1015868 kB
 Free RAM: 638914 kB (105418 cached pss + 180168 cached + 353328 free)
 Used RAM: 211428 kB (186096 used pss + 8008 buffers + 520 shmem + 16804 slab)
 Lost RAM: 165526 kB
   Tuning: 96 (large 256), oom 20480 kB, restore limit 6826 kB (high-end-gfx)

该命令打印的最后一部分,反应系统级别的内存状况:
Total RAM: 1015868 kB
Free RAM: 638914 kB (105418 cached pss + 180168 cached + 353328 free)
Used RAM: 211428 kB (186096 used pss + 8008 buffers + 520 shmem + 16804 slab)
Lost RAM: 165526 kB
Tuning: 96 (large 256), oom 20480 kB, restore limit 6826 kB (high-end-gfx)
里面某些字段的意义需要注意:
dumpsys meminfo

  1. Lost = driver reserve + GPU + ION
  2. Totol = Physic mem – MMZ(40M+) - kernel reserve(30M+)
  3. 实际可用内存 = Free

二、LowMemoryKiller和OOM Killer机制

OOM Killer(Out Of Memory Killer) 是Linux当中,内存保护机制的一种。当物理内存几乎耗尽而又需要分配新内存时,会杀掉一些优先级低的进程,释放内存。
LowMemoryKiller 是Android的内存保护机制。当物理内存低于阈值,就会杀掉一些优先级低的进程,释放内存。

联系:LowMemoryKiller 用到了 OOM Killer 的评分机制
区别:LowMemoryKiller 是通过阈值触发,OOM Killer 是分配内存失败时触发

评分原理:
oom_adj,代表进程的优先级, 数值越大,优先级越低,越容易被杀。系统分16个级别(取值范围[-16, 15]整数,不连续)
通过 cat /proc/xxx/oom_adj 查看,其中xxx是进程号
oom_score_adj: 在 oom_adj 基础上的评分,取值范围[-1000, 1000]
通过 cat /proc/xxx/oom_score_adj 查看,其中xxx是进程号

阈值查看,以98mv100为例:
cat /sys/module/lowmemorykiller/parameters/minfree
1024,1536,2048,3072,3584,4096
cat /sys/module/lowmemorykiller/parameters/adj
0,58,117,176,529,1000
上诉数值表示:可用内存低于 40964K 时,杀掉 oom_score_adj>=1000 的应用;可用内存低于 35844K 时,杀掉 oom_score_adj>=529 的应用,以此类推。

因此,客户可以通过调整 minfree 的阈值来触发 LowMemoryKiller 更频繁地杀应用,从而为高优先级应用省下内存。

在 dumpsys meminfo 中,GPU内存被统计到了 Lost RAM 里面了。

因此,当应用占用GPU内存过高时,不会体现在 Used RAM 里面,而是体现在 Lost RAM 中。反过来,如果发现有问题的时候 Lost RAM 很高,就需要看看GPU内存使用情况了。用以下命令:�
mount -t debugfs debugfs /sys/kernel/debug/
cat /sys/kernel/debug/mali/gpu_memory

130|root@MR820:/ # cat /sys/kernel/debug/mali/gpu_memory
Name (:bytes) pid mali_mem max_mali_mem external_mem ump_mem dma_mem

==============================================================================================================
  erhome.fhnotice            3065        3706880     3706880          0                0           1056768   
  .yx.itvhelpself            2883        6307840     6307840          0                0           13074432  
  ndroid.settings            2660        3670016     17088512         0                0           0         
  im.yixin.tv                2300        2875392     9961472          0                0           0         
  art.tv.cloud189            2618        3145728     8675328          0                0           0         
  e.wd.mylauncher            3035        2621440     14663680         0                0           0         
  ndroid.systemui            2139        524288      12054528         0                0           16384     
  .fiberhome.iptv            2356        1048576     6393856          0                0           0         
  surfaceflinger             1408        3948544     4210688          22118400         0           24367104  
Mali mem usage: 27848704
Mali mem limit: 536870912

其中mali_mem列就是应用占用的GPU内存

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容