查看Android应用内存的方法,Android应用开发Android 内存查看常用命令

本文将带你了解Android应用开发Android 内存查看常用命令,希望本文对大家学Android有所帮助。

6b084e7153af967a82249a0d6fc7609f.png

Android   内存查看常用命令,RAM(random-access   memory)即内存的使用情况对系统的性能影响很大,OOM问题、内存泄露、程序卡顿等诸多问题,都跟不合理的内存使用相关,并且这类问题一般都比较隐晦,要解决该类问题,熟悉内存查看的方法很有必要。

本篇博文介绍Android平台上常用的内存观测方法。

procrank与procmem

这两个命令均需要root权限才能运行。

procrank

procrank可以快速的总览当前系统各个进程的内存使用情况,其主要展示了4个指标:

Vss(virtual set size):   进程可访问的内存大小,包含了共享内存。Android系统中大量的内存空间会被多个进程共享,比如一个进程在运行期间会调用到其他进程,那么Vss也就将调用到的其它进程的内存统计进来了。   Rss(resident set size): 进程实际使用的内存大小,同样也包含了共享内存,但它只将实际用到的共享内存统计入内。 Pss(proportional   set size): 进程自身内存大小+按比例分配的共享内存大小。 Uss(unique set size):   进程自身的内存大小,不包括使用到的其他共享内存。程序退出后,系统就会多出Uss大小的内存出来。

举个例子说明下:假如有进程A,其自身运行期间的私有内存大小为a,进程B运行期间占据了b大小的内存。

A运行期间需要依赖B,则Vss=a+b。

A依赖B,但只是用到了B进程下的部分内存区域,大小为b1。则Rss=a+b1(b1<=b)

除了A以外,还有3个进程也同样在使用B,则Pss=a+b/(1+3)

只统计A进程自身占用的内存,则Uss=a

procrank的使用说明

# procrank -h

Usage: procrank [ -W ] [ -v | -r | -p | -u | -s | -h ]

-v  Sort by VSS.

-r  Sort by RSS.

-p  Sort by PSS.

-u  Sort by USS.

-s  Sort by swap.

(Default sort order is   PSS.)

-R  Reverse sort order (default is   descending).

-c  Only show cached (storage backed)   pages

-C  Only show non-cached (ram/swap backed)   pages

-k  Only show pages collapsed by KSM

-w  Display statistics for working set   only.

-W  Reset working set of all processes.

-h  Display this help screen.

其运行结果如下:

PID       Vss      Rss        Pss      Uss    cmdline

3062    1735540K  131548K   85448K     78648K    system_server

3428    1028392K  115896K   74462K     68900K      com.android.systemui

26426  1012992K   83272K     42890K   39664K    com.android.settings

3806    1001248K   81064K   41639K     38840K      com.android.phone

353   152208K     40524K   28086K   26516K      /system/bin/cameraserver

3414   978800K     64344K   27342K   25120K      com.google.android.inputmethod.pinyin

9885    1643528K   64880K   24821K     22012K    com.android.mms

分析内存问题主要关注的是Uss跟Pss,尤其是Uss.因为Vss和Rss包含了共享内存,单个进程分析内存大小时,会有干扰。

由于procrank会列出整个系统进程的内存信息,而更多时候我们往往只关心特定进程的内存信息。可以用下面的shell语句过滤出我们关心的内容。

while true;do adb shell procrank|grep; sleep   6;done

上述命令会每隔6s打印出关心的进程内存信息。

procmem

procrank命令从宏观上给出了进程的内存总体情况,但如果需要详细分析某个进程的内存分配细节,这个时候就需要procmem出场了。

procmem使用说明:

# procmem

Usage: procmem [ -w | -W ] [ -p | -m ] [ -h ] pid

-w  Displays statistics for the working set   only.

-W  Resets the working set of the   process.

-p  Sort by PSS.

-m  Sort by mapping order (as read from   /proc).

-h  Hide maps with no RSS.

比如我们查看settings应用的内存分布:

# procmem -m 26426 (26426为settings的pid)

Vss      Rss        Pss      Uss     ShCl       ShDi     PrCl     PrDi    Name

-------  -------  -------    -------  -------  -------    -------  -------

2084K       0K       0K       0K       0K       0K       0K       0K    /dev/ashmem/dalvik-main space (deleted)

194524K       0K       0K       0K       0K       0K       0K       0K    /dev/ashmem/dalvik-main space (deleted)

12560K   10492K     10492K   10492K       0K       0K     10488K       4K  /dev/ashmem/dalvik-main space 1   (deleted)

1780K       0K       0K       0K       0K       0K       0K       0K    /dev/ashmem/dalvik-main space 1 (deleted)

182268K       0K       0K       0K       0K       0K       0K       0K    /dev/ashmem/dalvik-main space 1 (deleted)

7436K    7436K      4277K    4172K    3264K       0K      4172K       0K    /data/dalvik-cache/arm/system@framework@boot.art

31116K   15260K      1696K     124K   15136K       0K       124K       0K    /data/dalvik-cache/arm/system@framework@boot.oat

4K       4K       0K       0K       4K       0K       0K       0K    /data/dalvik-cache/arm/system@framework@boot.oat

0K       0K       0K       0K       0K       0K       0K       0K    [vectors]

-------  -------  -------    -------  -------  -------    -------  -------

1130688K  148940K  108346K    104332K   44512K      96K     62100K   42452K  TOTAL

中间大量的输出结果省略。

从procmem输出的结果可以看到它给出了内存是如何分配的细节,但面对这茫茫多的输出数据,我们该如何从中寻找问题点呢?

内存异常问题往往伴随着内存泄露,而内存泄露的本质就是申请的内存区域得不到正常释放,表现在procmem的输出结果就是多条同名的记录出现。因此如果发现procmem输出的结果里某条记录出现次数过多,比如五六百次,那么我们应当小心对待了。

dumpsys meminfo

dumpsys meminfo 也是分析内存的一把利器,如果不跟进程名或者进程号,则输出系统整体的内存情况,跟进程名则输出该进程的内存分配情况。

# adb shell dumpsys meminfo 26426

Applications Memory Usage (in Kilobytes):

Uptime: 206814437 Realtime: 374715375

** MEMINFO in pid 26426 [com.android.settings] **

Pss  Private    Private     Swap     Heap       Heap     Heap

Total    Dirty      Clean    Dirty     Size      Alloc     Free

------   ------     ------   ------   ------     ------   ------

Native Heap    32062      32016        0        0      67584    27961    39622

Dalvik Heap     9623       9504        0        0      21384     9096    12288

Dalvik Other     4857       4824        0        0

Stack      404        404        0        0

Ashmem        2        0        0        0

Gfx dev    40220      40220        0        0

Other dev        6        0        4        0

.so mmap     1258        184       16        0

.jar mmap        8        8        0        0

.apk mmap      865        0        392        0

.ttf mmap       63        0        8        0

.dex mmap     6464        8       6456        0

.oat mmap     1694        0        124        0

.art mmap     4280       4172        0        0

Other mmap      563        4        156        0

EGL mtrack    13056      13056        0        0

Unknown      601        600        0        0

TOTAL   116026     105000     7156        0      88968    37057    51910

App Summary

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值