Android常用內存分析命令
1.procrank
獲取所有進程的內存使用的排行榜,按PSS排序
2.free
查看可用內存,單位KB
3.cat /proc/meminfo
查看系統(tǒng)整體內存情況,內存項按類型分類
MemAvailable ≈ MemFree+Buffers+Cached
每個進程的kernel stack 是16K,根據(jù)這個可以判斷后臺進程數(shù)
- MemAvailable = free - kernel reserved memory + ative file + inactive file + SReclaimable - 2 * zone low water mark
- Cached = All file page - buffers - swapping = Active file + Inactive file + Unevictable file - Buffers
- Slab = SReclaimable + SUnreclaimable
- Active = Active(anon) + Active(file)
- Inactive = Inactive(anon) + Inactive(file)
- AnonPages + Buffers + Cached = Active + Inactive
- Buffers + Cached = Active(file) + Inactive(file)
- SwapTotal = SwapFree + SwapUsed(Not SwapCached)
- KernelStack = the number of kernel task * Stack Size(16K)
- Kernel Memory Usage = KernelStack + USlab + PageTables + Shmem + Vmalloc
- Native Memory Usage = Mapped + AnonPages + Others
dumpsys meminfo
打印整體所有進程的內存使用,詳細每個指標介紹寫在《內存使用情況與監(jiān)測》中dumpsys meminfo [pid | packageName]
針對具體進程or包名指行dump操作
6.cat /proc/pid/oom_score_adj
查看進程內存查殺優(yōu)先級,-1000~1000范圍,系統(tǒng)進程-1000,前臺進程0,cache在900后
7.sys/module/lowmemorykiller/parameters/minfree
sys/module/lowmemorykiller/parameters/adj
舊版本lowmemorykiller使用的水位,Android R以后可以使用getprop |grep minfree查看
8.tombstone可以看虛擬內存的map
9.紅屏異常等看SYSTEM_MEM_LOG 確認是否內存泄漏
10.cat /sys/kernel/debug/page_owner
- cat sys/kernel/slab/kmalloc-128
12.內核也提供了接口給用戶觸發(fā)規(guī)整動作,接口如下:/proc/sys/vm/compact_memory
只要往這個節(jié)點寫值即可觸發(fā)對系統(tǒng)所有node管理的內存做內存規(guī)整。
13.查看安卓后臺cache 應用,一般8G設置為64,12G設置為128,6G設置為32,4G設置為16或者8
dumpsys activity settings |grep CUR_MAX_CACHED_PROCESSES
14.內核內存申請失敗or超時log
查看kernel log打印:page allocation stalls for xxx ms 一般超過1s都是比較嚴重了
-
event.log 中搜索am_pss可以看各進程占用,搜索killinfo可以查看lmkd查殺進程信息
看log發(fā)現(xiàn)申請內存時order = 2的大?。ㄒ簿褪?6KB),但buddy system 16KB的內存池只有:19*16kB (H)
其中的標志H表示這是highatomic的,禁止偷頁。只有傳進來的gfp_mask帶有GFP_ATOMIC才能申請reserve的內存,所以發(fā)生了kernel OOM。
這題明顯是內存碎片化。
dumpsys activity lmk 統(tǒng)計lmk打印
dumpsys meminfo 中的lostram統(tǒng)計
long lostRAM = memInfo.getTotalSizeKb() - (totalPss - totalSwapPss) - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb() - memInfo.getKernelUsedSizeKb() - memInfo.getZramTotalSizeKb();
18.DDR實時頻率(雖然沒啥用)
cat /sys/kernel/debug/clk/measure_only_mccc_clk/clk_measure
cat /proc/pagetypeinfo 查看當前buddy信息
(blocksize 和CONFIG_HUGETLB_PAGE有關,打開為2M,關閉為4M )cat /proc/zoneinfo 查看當前zone信息
zoneinfo_show_print -> node_page_state 讀pglist_data的vm_stat計數(shù)器
spanned 2095616 內存管理區(qū)包含的頁面
present 1980484 內存管理區(qū)實際管理的頁面
managed 1921719 內存管理區(qū)被buddy管理的頁面
protection: (0, 0) 預留的內存
node_unreclaimable: 0 頁面回收失敗次數(shù)
start_pfn: 525824 內存管理區(qū)的起始頁幀號
- cat /proc/$pid/status |grep -E 'Name|Pid|Vm|Rss|Vm|Hu'
進程相關的內存信息
#include<linux/mm_type.h>
enum {
MM_FILEPAGES, /* Resident file mapping pages */
MM_ANONPAGES, /* Resident anonymous pages */
MM_SWAPENTS, /* Anonymous swap entries */
MM_SHMEMPAGES, /* Resident shared memory pages */
MM_UNRECLAIMABLE, /* Unreclaimable pages, e.g. shared with HW */
NR_MM_COUNTERS
};
- /proc/sys/vm 目錄下均是調優(yōu)參數(shù)
定義在kernel/sysctl.c中,通過proc文件系統(tǒng)實現(xiàn)
static struct ctl_table vm_table[] = {
{
.procname = "overcommit_memory",
.data = &sysctl_overcommit_memory, //傳遞的參數(shù),通常是某個全局變量
.maxlen = sizeof(sysctl_overcommit_memory), //data的長度
.mode = 0644, //節(jié)點的文件權限,用戶可讀寫,其他只讀
.proc_handler = proc_dointvec_minmax, //節(jié)點在內核中的回調函數(shù)
.extra1 = &zreo, //這個參數(shù)的最小值
.extra1 = &two, //這個參數(shù)的最大值
},
...
}
- /proc/iomem 也提供了有關物理內存劃分出的各個段的一些信息。
wolfgang@meitner> cat /proc/iomem
00000000-0009e7ff : System RAM
0009e800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000f0000-000fffff : System ROM
00100000-17ceffff : System RAM
00100000-00381ecc : Kernel code
00381ecd-004704df : Kernel data