安卓内存分析
判斷RAM是否不足
物理內(nèi)存就是系統(tǒng)硬件提供的內(nèi)存大小,是真正的內(nèi)存,相對(duì)于物理內(nèi)存,在linux下還有一個(gè)虛擬內(nèi)存的概念,虛擬內(nèi)存就是為了滿足物理內(nèi)存的不足而提出的策略,它是利用磁盤空間虛擬出的一塊邏輯內(nèi)存,用作虛擬內(nèi)存的磁盤空間被稱為交換空間(Swap Space)。
系統(tǒng)優(yōu)先使用物理內(nèi)存2,如果
SWAP free 很小說明虛擬內(nèi)存幾乎耗盡
swappiness參數(shù)值可設(shè)置范圍在0到100之間。 此參數(shù)值越低,就會(huì)讓Linux系統(tǒng)盡量少用swap分區(qū),多用物理內(nèi)存;參數(shù)值越高就是反過來,使內(nèi)核更多的去使用swap空間。Ubuntu系統(tǒng)swappiness默認(rèn)值為60,表示的含義可以這樣來理解,當(dāng)剩余物理內(nèi)存低于40%(40=100-60)時(shí),開始使用swap分區(qū)。
130|G8142:/ $ cat /proc/sys/vm/swappiness 100若是你觀察Swap 中的使用量一直在增長,或Swap used 為一個(gè)很大的值。那咱們基本就能肯定在現(xiàn)有的情況下內(nèi)存出現(xiàn)問題。
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,釋放內(nèi)存
LowMemoryKiller是一種根據(jù)內(nèi)存閾值級(jí)別觸發(fā)的內(nèi)存回收的機(jī)制,在系統(tǒng)可用內(nèi)存較低時(shí),就會(huì)選擇性殺死進(jìn)程的策略,相對(duì)OOMKiller,更加靈活。
LowMemoryKiller是一種根據(jù)內(nèi)存閾值級(jí)別觸發(fā)的內(nèi)存回收的機(jī)制,在系統(tǒng)可用內(nèi)存較低時(shí),就會(huì)選擇性殺死進(jìn)程的策略,相對(duì)OOMKiller,更加靈活。
查看LowMemoryKiller閾值,留個(gè)數(shù)字代表六種進(jìn)程的閾值(foreground(前臺(tái)進(jìn)程)、visible(可見進(jìn)程)、secondary?server(次要服務(wù))、hidden(后臺(tái)進(jìn)程)、content?provider(內(nèi)容供應(yīng)節(jié)點(diǎn))、empty(空進(jìn)程))
adb shell cat /sys/module/lowmemorykiller/parameters/minfree
18432,23040,27648,32256,80296,105640
以上數(shù)字是page,1 page =4k
72MB? 90MB 108MB? 216MB 315MB 412MB
查看進(jìn)程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(前臺(tái)應(yīng)用)
cache 127124kB is below limit 129024kB for oom_score_adj
adj分級(jí)
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 zygote64PS 命令結(jié)果中各列的含義:
USER 進(jìn)程所屬用戶
PID 進(jìn)程ID
%CPU 進(jìn)程占用CPU百分比
%MEM 進(jìn)程占用內(nèi)存百分比
VSZ 虛擬內(nèi)存占用大小 單位:kb(killobytes)
RSS 實(shí)際內(nèi)存占用大小 單位:kb(killobytes)
TTY 終端類型
STAT 進(jìn)程狀態(tài)
START 進(jìn)程啟動(dòng)時(shí)刻
TIME 進(jìn)程運(yùn)行時(shí)長
COMMAND 啟動(dòng)進(jìn)程的命令
內(nèi)存不足導(dǎo)致頻繁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.216msI/art: <GC觸發(fā)原因> <GC名稱> <釋放對(duì)象個(gè)數(shù)>(<釋放字節(jié)數(shù)>) AllocSpace Objects,<釋放大對(duì)象個(gè)數(shù)>(<釋放大對(duì)象字節(jié)數(shù)>) <堆統(tǒng)計(jì)> LOS objects, <暫停時(shí)間>
GC觸發(fā)原因:Explicit
GC名稱:concurrent mark sweep GC
釋放對(duì)象個(gè)數(shù):104710
釋放字節(jié)數(shù):7M
釋放大對(duì)象個(gè)數(shù):21
釋放大對(duì)象字節(jié)數(shù):416KB
堆統(tǒng)計(jì):堆空閑內(nèi)存為33%,已用內(nèi)存:25M, 總內(nèi)存總:38M
暫停時(shí)間:GC暫停時(shí)長:1.230ms,GC總時(shí)長:67.216ms
- VSS?- Virtual Set Size 虛擬耗用內(nèi)存(包含共享庫占用的內(nèi)存)
- RSS?- Resident Set Size 實(shí)際使用物理內(nèi)存(包含共享庫占用的內(nèi)存)
- PSS?- Proportional Set Size 實(shí)際使用的物理內(nèi)存(比例分配共享庫占用的內(nèi)存)
- USS?- Unique Set Size 進(jìn)程獨(dú)自占用的物理內(nèi)存(不包含共享庫占用的內(nèi)存)
一般來說內(nèi)存占用大小有如下規(guī)律:VSS >= RSS >= PSS >= USS
Overview
本篇文章的目的是為了幫助理解從多種工具導(dǎo)出的關(guān)于Linux進(jìn)程真實(shí)占用內(nèi)存的報(bào)告。
Android?有一個(gè)叫做?procrank?(/system/xbin/procrank)的工具,它可以從高到低地列出Linux進(jìn)程的內(nèi)存占用量 。 每個(gè)進(jìn)程按大小可以分為 VSS, RSS, PSS, 和USS.
為了簡化描述,以下內(nèi)存將以“頁”的形式來表示,而不是“字節(jié)”。像我們的Linux系統(tǒng)內(nèi)存管理中最低級(jí)別的頁有4096 字節(jié)。
VSS?(reported as VSZ from ps) 是一個(gè)進(jìn)程總共可訪問的地址空間。其大小還包括了可能不在RAM中的內(nèi)存(比如雖然malloc分配了空間,但尚未寫入)。?VSS 很少被用于判斷一個(gè)進(jìn)程的真實(shí)內(nèi)存使用量。
RSS?是一個(gè)進(jìn)程在RAM中真實(shí)存儲(chǔ)的總內(nèi)存。但是RSS還是可能會(huì)造成誤導(dǎo),因?yàn)樗鼉H僅表示該進(jìn)程所使用的所有共享庫的大小,它不管有多少個(gè)進(jìn)程使用該共享庫,該共享庫僅被加載到內(nèi)存一次。所以RSS并不能準(zhǔn)確反映單進(jìn)程的內(nèi)存占用情況。?
PSS?與RSS不同,它按比例表示使用的共享庫,?例如:如果有三個(gè)進(jìn)程都使用了一個(gè)共享庫,共占用了30頁內(nèi)存。那么PSS將認(rèn)為每個(gè)進(jìn)程分別占用該共享庫10頁的大小。 PSS是非常有用的數(shù)據(jù),因?yàn)橄到y(tǒng)中所有進(jìn)程的PSS都相加的話,就剛好反映了系統(tǒng)中的總共占用的內(nèi)存。 而當(dāng)一個(gè)進(jìn)程被銷毀之后, 其占用的共享庫那部分比例的PSS,將會(huì)再次按比例分配給余下使用該庫的進(jìn)程。這樣PSS可能會(huì)造成一點(diǎn)的誤導(dǎo),因?yàn)楫?dāng)一個(gè)進(jìn)程被銷毀后,PSS不能準(zhǔn)確地表示返回給全局系統(tǒng)的內(nèi)存(the memory returned to the overall system)。
USS?是一個(gè)進(jìn)程所占用的私有內(nèi)存。即該進(jìn)程獨(dú)占的內(nèi)存。?USS是非常非常有用的數(shù)據(jù),因?yàn)樗从沉诉\(yùn)行一個(gè)特定進(jìn)程真實(shí)的邊際成本(增量成本)。當(dāng)一個(gè)進(jìn)程被銷毀后,USS是真實(shí)返回給系統(tǒng)的內(nèi)存。當(dāng)進(jìn)程中存在一個(gè)可疑的內(nèi)存泄露時(shí),USS是最佳觀察數(shù)據(jù)。
總結(jié)
- 上一篇: android 仿支付宝菜单_这个 An
- 下一篇: 机器学习导论(张志华):多项式分布