天天看点

:【转】android 手机应用内存测试1

一、如何查看内存

  方式一、adb shell dumpsys meminfo

  

  1. C:\Users\Administrator>adb shell dumpsys meminfo  
  2. Applications Memory Usage (kB):  
  3. Uptime: 14868066 Realtime: 21560285  
  4. Total PSS by process:  
  5.     35958 kB: system (pid 463)  
  6.     30518 kB: com.bbk.launcher2 (pid 824)  
  7.     26253 kB: com.android.systemui (pid 630)  
  8.     20983 kB: com.android.settings (pid 7366)  
  9.     10239 kB: com.android.phone (pid 706)  
  10.      9986 kB: com.tencent.qqpimsecure (pid 893)  
  11.      9326 kB: com.iqoo.ime.service (pid 685)  
  12.      8962 kB: android.process.media (pid 796)  
  13.      7418 kB: com.sohu.sohuvideo:log_service (pid 6695)  
  14.      7140 kB: com.ting.mp3.oemc.android:pushservice_v1 (pid 6502)  
  15.      7074 kB: com.mediatek.bluetooth (pid 716)  
  16.      7062 kB: com.sina.weibo (pid 2429)  
  17.      7033 kB: android.process.acore (pid 1150)  
  18.      6288 kB: com.sina.weibo.servant (pid 5979)  
  19.      5898 kB: com.eg.android.AlipayGphone (pid 3473)  
  20.      5435 kB: com.android.ActivityNetwork (pid 6621)  
  21.      5327 kB: com.tencent.mm (pid 6553)  
  22.      5281 kB: com.android.bbkmusic (pid 1322)  
  23.      4559 kB: com.netease.pris:push (pid 7126)  
  24.      4445 kB: com.android.mms (pid 6463)  
  25.      4392 kB: com.mediatek.mdlogger (pid 725)  
  26.      4347 kB: com.baidu.map.location:remote (pid 843)  
  27.      4275 kB: com.mediatek.mobilelog (pid 7063)  
  28.      4254 kB: com.android.contacts (pid 857)  
  29.      3993 kB: com.bbk.appstore (pid 7262)  
  30.      3854 kB: com.mediatek.MediatekDM (pid 6281)  
  31.      3667 kB: com.android.keychain (pid 7276)  
  32.      3623 kB: com.baidu.map.location (pid 784)  
  33.      3387 kB: com.mediatek.atci.service (pid 7110)  
  34.      3359 kB: com.android.bbksoundrecorder (pid 746)  
  35.      3265 kB: com.svox.pico (pid 7332)  
  36.      3261 kB: com.android.defcontainer (pid 6448)  
  37. Total PSS by OOM adjustment:  
  38.     35958 kB: System  
  39.                35958 kB: system (pid 463)  
  40.     63631 kB: Persistent  
  41.                26253 kB: com.android.systemui (pid 630)  
  42.                10239 kB: com.android.phone (pid 706)  
  43.                 7074 kB: com.mediatek.bluetooth (pid 716)  
  44.                 7033 kB: android.process.acore (pid 1150)  
  45.                 5281 kB: com.android.bbkmusic (pid 1322)  
  46.                 4392 kB: com.mediatek.mdlogger (pid 725)  
  47.                 3359 kB: com.android.bbksoundrecorder (pid 746)  
  48.     29945 kB: Foreground  
  49.                20983 kB: com.android.settings (pid 7366)  
  50.                 8962 kB: android.process.media (pid 796)  
  51.     27841 kB: Perceptible  
  52.                 9986 kB: com.tencent.qqpimsecure (pid 893)  
  53.                 9326 kB: com.iqoo.ime.service (pid 685)  
  54.                 4275 kB: com.mediatek.mobilelog (pid 7063)  
  55.                 4254 kB: com.android.contacts (pid 857)  
  56.     14255 kB: A Services  
  57.                 7140 kB: com.ting.mp3.oemc.android:pushservice_v1 (pid 6502)  
  58.                 3854 kB: com.mediatek.MediatekDM (pid 6281)  
  59.                 3261 kB: com.android.defcontainer (pid 6448)  
  60.     30518 kB: Home  
  61.                30518 kB: com.bbk.launcher2 (pid 824)  
  62.     27087 kB: B Services  
  63.                 7418 kB: com.sohu.sohuvideo:log_service (pid 6695)  
  64.                 6288 kB: com.sina.weibo.servant (pid 5979)  
  65.                 5435 kB: com.android.ActivityNetwork (pid 6621)  
  66.                 4559 kB: com.netease.pris:push (pid 7126)  
  67.                 3387 kB: com.mediatek.atci.service (pid 7110)  
  68.     41627 kB: Background  
  69.                 7062 kB: com.sina.weibo (pid 2429)  
  70.                 5898 kB: com.eg.android.AlipayGphone (pid 3473)  
  71.                 5327 kB: com.tencent.mm (pid 6553)  
  72.                 4445 kB: com.android.mms (pid 6463)  
  73.                 4347 kB: com.baidu.map.location:remote (pid 843)  
  74.                 3993 kB: com.bbk.appstore (pid 7262)  
  75.                 3667 kB: com.android.keychain (pid 7276)  
  76.                 3623 kB: com.baidu.map.location (pid 784)  
  77.                 3265 kB: com.svox.pico (pid 7332)  
  78. Total PSS by category:  
  79.    145990 kB: Dalvik  
  80.     44471 kB: Unknown  
  81.     35557 kB: Other dev  
  82.     24404 kB: .so mmap  
  83.     14348 kB: .dex mmap  
  84.      3830 kB: Other mmap  
  85.      1214 kB: .apk mmap  
  86.       524 kB: Native  
  87.       424 kB: .ttf mmap  
  88.        68 kB: Ashmem  
  89.        32 kB: Cursor  
  90.         0 kB: .jar mmap  
  91. Total PSS: 270862 kB  
  92.       KSM: 0 kB saved from shared 0 kB  
  93.            0 kB unshared; 0 kB volatile  

adb shell dumpsys meminfo <package_name>

其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name(linux下,windows下安装cygwin后就可以使用了[安装完后记得设置path]) 来查找,下图是某个程序的内存使用情况:

:【转】android 手机应用内存测试1

重点关注如下几个字段:

(1) Native/Dalvik 的 Heap 信息

具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息

这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

方式二:使用 adb shell procrank 命令(failed)

  1. C:\Users\Administrator>adb shell procrank  
  2.   PID      Vss      Rss      Pss      Uss  cmdline  
  3.   463   61772K   61704K   36103K   32180K  system_server  
  4.   824   55208K   55112K   30643K   29204K  com.bbk.launcher2  
  5.   630   54492K   54376K   26423K   21896K  com.android.systemui  
  6.  7366   48596K   48492K   20979K   17016K  com.android.settings  
  7. ....
  1.  104     324K     324K     102K     100K  /system/bin/6620_launcher  
  2.   107     680K     680K      94K      52K  /system/bin/mobile_log_d  
  3.  1238     320K     316K      90K      88K  sh  
  4.  1229     316K     312K      90K      88K  sh  
  5.  1219     316K     312K      90K      88K  sh  
  6.                           ------   ------  ------  
  7.                          328033K  282552K  TOTAL  
  8. RAM: 482092K total, 3732K free, 4052K buffers, 110608K cached, 476K shmem, 24624K slab 

可以看到,在linux下表示内存的耗用情况有四种不同的表现形式:  

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)  

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)  

PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)  

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

VSS:VSS表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。

RSS:表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。

PSS:表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。

USS:表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式! 可以看到:VSS>=RSS>=PSS>=USS

方式二、中能看出当前系统总共有多少内存,有多少空闲,有多少buffer,缓存等信息

当前使用这两种方式的前提是 adb remount 能够成功。

可以通过 adb shell kill PIDNumber 来杀死你想杀死的后台进程来模拟某种 bug 的复现条件。

譬如 adb shell kill 630 就能杀死 com.android.systemui 这个进程,有兴趣的可以尝试一下,盯住手机屏幕看下有什么反应……

方式三、adb shell ps 可以查看当前终端中的进程信息

那么如何在代码中判断当前的硬件系统有多少的 RAM 呢?

 使用下面代码可以奏效:

在 Framework  ProcessList.java 中有如下代码可用:

  1. ProcessList() {  
  2.    MemInfoReader minfo = new MemInfoReader();  
  3.    minfo.readMemInfo();  
  4.    mTotalMemMb = minfo.getTotalSize()/(1024*1024);  
  5. }        

这个可以用于 app 层来适配不同内存配置的机型。

方式4. 在IDE中查看Log信息

当程序运行垃圾回收的时候,会打印一条Log信息,其格式如下:

D/dalvikvm: <GC_Reason> <Amount_freed>, <Heap_stats>, <External_memory_stats>, <Pause_time>

GC_Reason表示导致垃圾回收的原因以及当前的回收类型,包括以下几类:

GC_CONCURRENT:当堆中对象数量达到一定是触发的垃圾收集

GC_FOR_MALLOC:在内存已满的情况下分配内存,此时系统会暂停程序并回收内存

GC_HPROF_DUMP_HEAP:创建FPFOR文件来分析Heap时所造成的垃圾收集

GC_EXPLICIT: 程序调用了垃圾收集函数System.gc

GC_EXTERNAL_ALLOC: 出现在API 10及以下,为外部分配内存(native memory or NIO buffer)所造成的垃圾回收,高版本全部分配在Dalvik Heap中。

Amount_freed 表示此次回收的内存

Heap_stats 表示空闲内存百分比和存活对象大小/堆的总大小

External_memory_stats 表示API 10及以下的外部分配内存,已分配内存/导致垃圾回收的界限

Pause_time 暂停时间,一个表示开始回收垃圾的时间,另一个表示回收结束的暂停时间

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小。

参考资料:http://ticktick.blog.51cto.com/823160/1346785