安卓内存分析

判断RAM是否不足

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

系统优先使用物理内存2,如果

SWAP free 很小说明虚拟内存几乎耗尽

swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用物理内存;参数值越高就是反过来,使内核更多的去使用swap空间。Ubuntu系统swappiness默认值为60,表示的含义可以这样来理解,当剩余物理内存低于40%(40=100-60)时,开始使用swap分区。

130|G8142:/ $ cat /proc/sys/vm/swappiness
100

若是你观察Swap 中的使用量一直在增长,或Swap used 为一个很大的值。那咱们基本就能肯定在现有的情况下内存出现问题。

adb shell dmesg

[  367.044922] lowmemorykiller: Killing 'le.smartcharger' (16156), adj 500,\x0a   
to free 30152kB on behalf of 'kswapd0' (149) 
because cache 127124kB is below limit 129024kB for oom_score_adj 300\x0a  
 Free memory is 64144kB above reserved.\x0a   
Free CMA is 0kB\x0a   
Total reserve is 67076kB\x0a   
Total free pages is 71784kB\x0a   
Total file cache is 266924kB\x0a   
Total zcache is 0kB\x0a   
GFP mask is 0x24000c0

为了kswapd0 kill le.smartcharger,释放内存

LowMemoryKiller是一种根据内存阈值级别触发的内存回收的机制,在系统可用内存较低时,就会选择性杀死进程的策略,相对OOMKiller,更加灵活。

LowMemoryKiller是一种根据内存阈值级别触发的内存回收的机制,在系统可用内存较低时,就会选择性杀死进程的策略,相对OOMKiller,更加灵活。

查看LowMemoryKiller阈值,留个数字代表六种进程的阈值(foreground(前台进程)、visible(可见进程)、secondary server(次要服务)、hidden(后台进程)、content provider(内容供应节点)、empty(空进程))

adb shell cat /sys/module/lowmemorykiller/parameters/minfree
18432,23040,27648,32256,80296,105640

以上数字是page,1 page =4k

72MB  90MB 108MB  216MB 315MB 412MB

查看进程adj值

G8142:/ # ps -A | grep home
u0_a73       17192  1334 2549212 186148 SyS_epoll_wait 78d5886e18 S com.sonymobile.home

G8142:/ # cat /proc/17192/oom_adj
0(前台应用)

cache 127124kB is below limit 129024kB for oom_score_adj

adj分级


adb shell dumpsys meminfo

Total PSS by process:
  1,822,879K: me.empirical.android.application.fillmemory (pid 4774 / activities)
    184,707K: system (pid 1761)
    178,099K: cn.kuwo.player (pid 30251 / activities)
     82,799K: com.android.systemui (pid 2065 / activities)
     82,508K: com.autonavi.minimap (pid 4940)
     62,671K: surfaceflinger (pid 887)
     62,577K: com.google.android.gms (pid 30684)
     60,254K: com.sonymobile.home (pid 25241 / activities)
     49,377K: com.google.android.googlequicksearchbox:search (pid 25181)
     40,010K: com.google.android.gms.persistent (pid 23913)
     34,436K: com.baidu.appsearch (pid 32238)
     29,319K: cn.kuwo.player:QS (pid 4411)
     26,922K: cn.kuwo.player:service (pid 30397)
     26,064K: com.android.chrome:sandboxed_process0 (pid 4876)
     24,093K: com.sonyericsson.textinput.chinese (pid 24577)
     22,566K: com.scee.psxandroid (pid 5114)
     21,962K: com.autonavi.minimap:locationservice (pid 5578)
     21,127K: media.codec (pid 1347)
     21,077K: com.android.phone (pid 2201)
     20,977K: android.hardware.graphics.composer@2.1-service (pid 841)
     20,711K: com.glgjing.stark (pid 32681)
     18,618K: com.spencerstudios.ramlogger (pid 2236 / activities)
     18,104K: logd (pid 634)
     17,697K: cn.kuwo.player:pushservice (pid 30891)
     16,321K: com.google.android.googlequicksearchbox:interactor (pid 25162)
     15,409K: com.android.chrome:sandboxed_process0 (pid 32715)
     14,930K: com.baidu.appsearch:bdservice_v1 (pid 4479)

adb shell ps -A --sort=-rss 按RSS倒序排序

G8142:/ $ ps -A --sort=-rss
USER           PID  PPID     VSZ    RSS WCHAN            ADDR S NAME
u0_a201      18429  1322 5025684 1293032 0                  0 R me.empirical.android.application.fillmemory
u0_a203      18443  1323 2746396 539492 0                   0 S com.autonavi.minimap
system        1761  1322 2753392 268156 0                   0 S system_server
u0_a202      18189  1323 2098752 176720 0                   0 S cn.kuwo.player
u0_a61        2065  1322 2479628  76576 0                   0 S com.android.systemui
u0_a31        7488  1322 2714796  70224 0                   0 S com.google.android.gms
u0_a203      18530  1323 1798436  69024 0                   0 S com.autonavi.minimap:locationservice
u0_a65        7595  1322 2503104  63908 0                   0 S com.google.android.googlequicksearchbox:search
u0_a181      20152  1323 1859244  62632 0                   0 S com.baidu.appsearch
u0_a73        7439  1322 2547736  60520 0                   0 S com.sonymobile.home
u0_a203      19407  1323 1772448  55268 0                   0 S com.autonavi.minimap:sandboxed_privilege_process0
u0_a31        7409  1322 2486368  52668 0                   0 S com.google.android.gms.persistent
u0_a202      18654  1323 1797076  50084 0                   0 S cn.kuwo.player:pushservice
system       14233  1322 2369756  49936 0                   0 S com.android.settings
u0_a202      18335  1323 1836772  48024 0                   0 S cn.kuwo.player:service
u0_a197      18456  1322 2267160  45024 0                   0 S com.spencerstudios.ramlogger
u0_a202      18673  1323 1766404  42236 0                   0 S cn.kuwo.player:QS
u0_a202      18734  1323 1764328  42064 0                   0 S cn.kuwo.player:lelinkps
u0_a76        7562  1323 1744660  41244 0                   0 S com.sonyericsson.textinput.chinese
u0_i59       19989  2112 1634652  39320 0                   0 S com.android.chrome:sandboxed
u0_a56       20524  1323 1709640  37872 0                   0 S com.sonymobile.indeviceintelligence:service
u0_i60       20075  2112 1654292  36500 0                   0 S com.android.chrome:sandboxed
radio         2201  1322 2335916  35304 0                   0 S com.android.phone
u0_a181      20169  1323 1714668  34972 0                   0 S com.baidu.appsearch:GuardService
u0_a31        7574  1322 2436916  27508 0                   0 S com.google.android.gms.unstable
system        8744  1322 2251672  27148 0                   0 S com.sonymobile.phoneusage
system        3042  1322 2256588  26404 0                   0 S com.sonyericsson.devicemonitor
u0_a31        6924  1322 2258596  22976 0                   0 S com.google.process.gapps
u0_a65        8800  1322 2366552  22948 0                   0 S com.google.android.googlequicksearchbox:interactor
system        3059  1322 2257940  22808 0                   0 S com.sonymobile.googleanalyticsproxy
u0_i57       19632  2112 1568220  22648 0                   0 S com.android.chrome:sandboxed
nfc           3017  1322 2273432  22516 0                   0 S com.android.nfc
radio         9642  1322 2244924  22016 0                   0 S com.qualcomm.qcrilmsgtunnel
system        8296  1322 2248820  21644 0                   0 S com.yzy.supercleanmaster
u0_a140      10551  1322 2239612  20712 0                   0 S com.android.smspush
u0_a67        5584  1322 2294400  20320 0                   0 S com.sonymobile.assist:realtime
u0_a166       7394  1322 2248880  20240 0                   0 S com.sonymobile.runtimeskinning.core
system        8883  1322 2239640  19708 0                   0 S com.sonyericsson.mtp.extension.backuprestore
logd           634     1   46960  17928 0                   0 S logd
root          1322     1 2166424  17636 0                   0 S zygote64

PS 命令结果中各列的含义:

USER 进程所属用户
PID 进程ID
%CPU 进程占用CPU百分比
%MEM 进程占用内存百分比
VSZ 虚拟内存占用大小 单位:kb(killobytes)
RSS 实际内存占用大小 单位:kb(killobytes)
TTY 终端类型
STAT 进程状态
START 进程启动时刻
TIME 进程运行时长
COMMAND 启动进程的命令


内存不足导致频繁GC


2021-08-30 22:32:51.822 29525-29535/com.autonavi.minimap I/zygote: NativeAllocBackground concurrent copying GC freed 41687(2MB) AllocSpace objects, 21(17MB) LOS objects, 46% free, 28MB/52MB, paused 352us total 105.028ms
2021-08-30 22:33:05.852 29525-29535/com.autonavi.minimap I/zygote: Background concurrent copying GC freed 41488(2MB) AllocSpace objects, 22(23MB) LOS objects, 46% free, 27MB/51MB, paused 444us total 105.340ms
2021-08-30 22:33:46.517 1761-1771/system_process I/zygote64: Background concurrent copying GC freed 425827(18MB) AllocSpace objects, 26(536KB) LOS objects, 42% free, 26MB/46MB, paused 3.217ms total 121.362ms

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects,
21(416KB) LOS objects,33% free, 25MB/38MB, paused 1.230ms total 67.216ms

I/art: <GC触发原因> <GC名称> <释放对象个数>(<释放字节数>) AllocSpace Objects,<释放大对象个数>(<释放大对象字节数>) <堆统计> LOS objects, <暂停时间>
GC触发原因:Explicit
GC名称:concurrent mark sweep GC
释放对象个数:104710
释放字节数:7M
释放大对象个数:21
释放大对象字节数:416KB
堆统计:堆空闲内存为33%,已用内存:25M, 总内存总:38M
暂停时间:GC暂停时长:1.230ms,GC总时长:67.216ms


  • VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
  • PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS













Overview

本篇文章的目的是为了帮助理解从多种工具导出的关于Linux进程真实占用内存的报告。

Android 有一个叫做 procrank (/system/xbin/procrank)的工具,它可以从高到低地列出Linux进程的内存占用量 。 每个进程按大小可以分为 VSS, RSS, PSS, 和USS.

为了简化描述,以下内存将以“页”的形式来表示,而不是“字节”。像我们的Linux系统内存管理中最低级别的页有4096 字节。

VSS (reported as VSZ from ps) 是一个进程总共可访问的地址空间。其大小还包括了可能不在RAM中的内存(比如虽然malloc分配了空间,但尚未写入)。 VSS 很少被用于判断一个进程的真实内存使用量。

RSS 是一个进程在RAM中真实存储的总内存。但是RSS还是可能会造成误导,因为它仅仅表示该进程所使用的所有共享库的大小,它不管有多少个进程使用该共享库,该共享库仅被加载到内存一次。所以RSS并不能准确反映单进程的内存占用情况。 

PSS 与RSS不同,它按比例表示使用的共享库, 例如:如果有三个进程都使用了一个共享库,共占用了30页内存。那么PSS将认为每个进程分别占用该共享库10页的大小。 PSS是非常有用的数据,因为系统中所有进程的PSS都相加的话,就刚好反映了系统中的总共占用的内存。 而当一个进程被销毁之后, 其占用的共享库那部分比例的PSS,将会再次按比例分配给余下使用该库的进程。这样PSS可能会造成一点的误导,因为当一个进程被销毁后,PSS不能准确地表示返回给全局系统的内存(the memory returned to the overall system)。

USS 是一个进程所占用的私有内存。即该进程独占的内存。 USS是非常非常有用的数据,因为它反映了运行一个特定进程真实的边际成本(增量成本)。当一个进程被销毁后,USS是真实返回给系统的内存。当进程中存在一个可疑的内存泄露时,USS是最佳观察数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值