闭眼能敲,Android内存分析command

Android常用内存分析命令

1.procrank
获取所有进程的内存使用的排行榜,按PSS排序

2.free
查看可用内存,单位KB

3.cat /proc/meminfo
查看系统整体内存情况,内存项按类型分类
MemAvailable ≈ MemFree+Buffers+Cached
每个进程的kernel stack 是16K,根据这个可以判断后台进程数

  • 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
  1. dumpsys meminfo
    打印整体所有进程的内存使用,详细每个指标介绍写在《内存使用情况与监测》中

  2. dumpsys meminfo [pid | packageName]
    针对具体进程or包名指行dump操作

6.cat /proc/pid/oom_score_adj
查看进程内存查杀优先级,-1000~1000范围,系统进程-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

  1. cat sys/kernel/slab/kmalloc-128

12.内核也提供了接口给用户触发规整动作,接口如下:/proc/sys/vm/compact_memory
只要往这个节点写值即可触发对系统所有node管理的内存做内存规整。

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都是比较严重了

  1. event.log 中搜索am_pss可以看各进程占用,搜索killinfo可以查看lmkd查杀进程信息

    看log发现申请内存时order = 2的大小(也就是16KB),但buddy system 16KB的内存池只有:19*16kB (H)
    其中的标志H表示这是highatomic的,禁止偷页。只有传进来的gfp_mask带有GFP_ATOMIC才能申请reserve的内存,所以发生了kernel OOM。

这题明显是内存碎片化。

  1. dumpsys activity lmk 统计lmk打印

  2. dumpsys meminfo 中的lostram统计

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

  1. cat /proc/pagetypeinfo 查看当前buddy信息
    (blocksize 和CONFIG_HUGETLB_PAGE有关,打开为2M,关闭为4M )

  2. cat /proc/zoneinfo 查看当前zone信息
    zoneinfo_show_print -> node_page_state 读pglist_data的vm_stat计数器

spanned  2095616      内存管理区包含的页面
present  1980484        内存管理区实际管理的页面
managed  1921719     内存管理区被buddy管理的页面
protection: (0, 0)          预留的内存
 
node_unreclaimable:  0   页面回收失败次数
start_pfn:           525824   内存管理区的起始页帧号
  1. 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
};
  1. /proc/sys/vm 目录下均是调优参数
    定义在kernel/sysctl.c中,通过proc文件系统实现
static struct ctl_table vm_table[] = {
{  
    .procname = "overcommit_memory",       
    .data          = &sysctl_overcommit_memory, //传递的参数,通常是某个全局变量
    .maxlen     = sizeof(sysctl_overcommit_memory),  //data的长度
    .mode        = 0644,  //节点的文件权限,用户可读写,其他只读
    .proc_handler = proc_dointvec_minmax,   //节点在内核中的回调函数
    .extra1      = &zreo,   //这个参数的最小值
    .extra1      = &two,    //这个参数的最大值
},
...
}
  1. /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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容