Android内存使用情况分析

Android系统的内存由几个不同的内存池中的几个不同的分配器管理。
目录:

  1. 系统内存
  2. 进程内存
    2.1 procrank
    2.2 smem tool
  3. Dalvik Heap
  4. 调试Android应用内存占用情况
    4.1 如何调试native进程内存分配情况
    4.2 libc.debug.malloc

系统内存

通过查看 /proc/meminfo,可以检查机器 上的内存视图。
如果使用DDMS,则可以查看机器,系统和不同执行进程使用的内存摘要。单击SysInfo选项卡,然后在窗格左上角的框中选择“Memory Usage”。

image.png

请注意,您可以通过将鼠标悬停在特定的饼图切片上来获取每个过程的数字。 数字以K和百分比显示。

进程内存

您可以通过检查/proc/<pid> / status来查看单个进程的内存使用情况

有关内存使用的详细信息

  • /proc/<pid>/statm
  • /proc/<pid>/maps
  • /proc/<pid>/smaps
    'top'命令将显示VSS和RSS。另请参阅上面的ddms信息。

procrank

procrank将向您显示进程内存利用率的快速摘要。 默认情况下,它显示Vss,Rss,Pss和Uss,并按Vss排序。 但是,您可以控制排序顺序。
procrank源包含在system/extras/procrank中,二进制文件位于android设备上的/system/ xbin中。

  • Vss = virtual set size--虚拟集大小
  • Rss = resident set size--常驻内存大小
  • Pss = proportional set size--比例集大小
  • Uss = unique set size--独占集大小
    通常,您要观看的两个数字是Pss和Uss(Vss和Rss通常毫无价值,因为它们不能准确反映进程对与其他进程共享的页面的使用情况。)对整体内存负载的影响。
  • Uss是进程独有的页面集。 这是当前终止应用程序时将释放的内存量。
  • Pss是与其他进程共享的内存量,其计算方式是在共享它的进程之间平均分配额度。 这是在进程终止时不会释放的内存,但表示此进程“贡献”的数量
    您还可以使用procrank查看每个进程的工作集大小,并重置工作集大小计数器。
    这是procrank的用法:
# procrank -h
Usage: procrank [ -W ] [ -v | -r | -p | -u | -h ]
    -v  Sort by VSS.
    -r  Sort by RSS.
    -p  Sort by PSS.
    -u  Sort by USS.
        (Default sort order is PSS.)
    -R  Reverse sort order (default is descending).
    -w  Display statistics for working set only.
    -W  Reset working set of all processes.
    -h  Display this help screen.

以下是一些示例输出:

# procrank
  PID      Vss      Rss      Pss      Uss  cmdline
 1217   36848K   35648K   17983K   13956K  system_server
 1276   32200K   32200K   14048K   10116K  android.process.acore
 1189   26920K   26920K    9293K    5500K  zygote
 1321   20328K   20328K    4743K    2344K  android.process.media
 1356   20360K   20360K    4621K    2148K  com.android.email
 1303   20184K   20184K    4381K    1724K  com.android.settings
 1271   19888K   19888K    4297K    1764K  com.android.inputmethod.latin
 1332   19560K   19560K    3993K    1620K  com.android.alarmclock
 1187    5068K    5068K    2119K    1476K  /system/bin/mediaserver
 1384     436K     436K     248K     236K  procrank
    1     212K     212K     200K     200K  /init
  753     572K     572K     171K     136K  /system/bin/rild
  748     340K     340K     163K     152K  /system/bin/sh
  751     388K     388K     156K     140K  /system/bin/vold
 1215     148K     148K     136K     136K  /sbin/adbd
  757     352K     352K     117K      92K  /system/bin/dbus-daemon
  760     404K     404K     104K      80K  /system/bin/keystore
  759     312K     312K     102K      88K  /system/bin/installd
  749     288K     288K      96K      84K  /system/bin/servicemanager
  752     244K     244K      71K      60K  /system/bin/debuggerd

在此示例中,它显示本机守护程序和普通程序比基于Dalvik的服务和程序小一个数量级。 此外,即使是最小的Dalvik程序也需要大约1.5兆(Uss)才能运行。

smem tool

您可以通过smem查看非常详细的每个进程或系统范围的内存信息。安卓smem用法

Dalvik Heap

Dalvik堆由zygote预加载类和数据(从Android 2.2版开始加载超过1900个类)。当zygote分支启动Android应用程序时,新应用程序将获得此堆的写入时拷贝映射,这有助于减少内存和应用程序启动时间。
像许多其他语言的虚拟机一样,Dalvik在堆上进行垃圾收集。 每个VM进程中似乎都有一个单独的线程(称为HeapWorker),用于执行垃圾回收操作。
Dan Borstein谈到堆共享:
它在Android中用于分摊与所有活动VM进程中的公共库类相关联的大量有效只读数据(技术上可写但很少实际编写)的RAM占用空间。 系统在启动时预加载1000多个类,每个类至少消耗一小堆自身,包括经常指向其他对象的宿。 由预加载过程创建的堆与每个生成的VM进程共享写入时拷贝(但实际上并没有写得太多)。 这为每个进程节省了数百KB的"脏"的不可分页RAM,并且还有助于加速进程启动。
请参阅Dianne Hackborn的精彩文章调试Android应用程序内存使用情况

如何调试native进程内存分配情况

setprop dalvik.vm.checkjni true
setprop libc.debug.malloc 10   
setprop setprop dalvik.vm.jniopts forcecopy
start
stop

libc.debug.malloc

系统中的C库(仿生)支持在系统运行时使用malloc代码的不同调试版本的能力。
如果系统属性libc.debug.malloc的值不是0,那么在实例化进程时,C库将使用函数为该进程分配和释放内存。
(请注意,还有其他方法可以使用调试共享库malloc代码。也就是说,如果您在模拟器中运行,并且系统属性ro.kernel.memcheck的值不是'0', 然后你得到20的调试级别。注意,调试级别20只能在模拟器中使用。)
默认情况下,使用标准的malloc / free / calloc / realloc / memalign例程。 通过设置libc.debug.malloc,可以使用不同的例程来检查某些类型的内存错误(例如泄漏和溢出)。 这是通过使用这些不同的例程加载单独的共享库(.so)来完成的。
共享库的名称为:/system/lib/libc_malloc_debug_leak.so和/system/lib/libc_malloc_debug_qemu.so
(通过查看<android-source-root> /bionic/libc/bionic/malloc_debug_common.c获得信息)

libc.debug.malloc(调试级别值)支持的值为:

  • 1 - 执行泄漏检测
  • 5 - 填充分配的内存以检测溢出
  • 10 - 填充内存并添加标记以检测溢出
  • 20 - 为模拟器使用特殊的检测malloc / free例程
    但我不确定这些共享库是否在生产设备中提供。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容