美文网首页
Android内存的相关排查方法

Android内存的相关排查方法

作者: Nothing_655f | 来源:发表于2020-09-09 18:32 被阅读0次

Android内存的相关排查方法 转载总结

几个基本概念

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)是单个进程全部可访问的地址空间
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止,
USS 就是实际被返还给系统的内存大小。 USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加

Android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。Android程序内存一般限制在16M,当然也有24M的。 从上信息对于分析内存泄露,内存溢出都有极大的作用,从以上信息可以看到该应用程序占用的native和dalvik,当TOTAL 16407 11792 12860 22275 18459 2003超过内存最大限制时会出现OOM错误。

一、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内存

dumpsys的分析

参考对dumpsys的分析:

  • dumpsys meminfo执行流程(一)

  • dumpsys meminfo执行流程(二)

  • dumpsys meminfo执行流程(三) 可知,dumpsys meminfo获得的free mem = cached pss + cached kernel + free + ion cached + gpu cached(系统cached APP PSS总和 + meminfo的MemFree + Cached + Buffers-Mapped + meminfo的display ion和gpu模块的内存占用)。 其中: cached pss:dumpsys meminfo中 cachedAPP那一栏的PSS总和 cached kernel:meminfo的Cached+Buffers-Mapped free:meminfo的MemFree ion cached以及gpu cached:display相关ion和gpu模块的内存占用

所以,dumpsys meminfo 是 /proc/meminfo中的MemFree加上一些cache和buffer。这主要是因为,在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。所以空闲内存=free+buffers+cached。

来自 https://www.jianshu.com/p/6893cea51512
来自 https://www.jianshu.com/p/5b7bec7e552b
来自 https://www.cnblogs.com/zhengtu2015/p/5327742.html

相关文章

网友评论

      本文标题:Android内存的相关排查方法

      本文链接:https://www.haomeiwen.com/subject/jacyektx.html