一、如何查看内存
方式一、adb shell dumpsys meminfo
- C:\Users\Administrator>adb shell dumpsys meminfo
- Applications Memory Usage (kB):
- Uptime: 14868066 Realtime: 21560285
- Total PSS by process:
- 35958 kB: system (pid 463)
- 30518 kB: com.bbk.launcher2 (pid 824)
- 26253 kB: com.android.systemui (pid 630)
- 20983 kB: com.android.settings (pid 7366)
- 10239 kB: com.android.phone (pid 706)
- 9986 kB: com.tencent.qqpimsecure (pid 893)
- 9326 kB: com.iqoo.ime.service (pid 685)
- 8962 kB: android.process.media (pid 796)
- 7418 kB: com.sohu.sohuvideo:log_service (pid 6695)
- 7140 kB: com.ting.mp3.oemc.android:pushservice_v1 (pid 6502)
- 7074 kB: com.mediatek.bluetooth (pid 716)
- 7062 kB: com.sina.weibo (pid 2429)
- 7033 kB: android.process.acore (pid 1150)
- 6288 kB: com.sina.weibo.servant (pid 5979)
- 5898 kB: com.eg.android.AlipayGphone (pid 3473)
- 5435 kB: com.android.ActivityNetwork (pid 6621)
- 5327 kB: com.tencent.mm (pid 6553)
- 5281 kB: com.android.bbkmusic (pid 1322)
- 4559 kB: com.netease.pris:push (pid 7126)
- 4445 kB: com.android.mms (pid 6463)
- 4392 kB: com.mediatek.mdlogger (pid 725)
- 4347 kB: com.baidu.map.location:remote (pid 843)
- 4275 kB: com.mediatek.mobilelog (pid 7063)
- 4254 kB: com.android.contacts (pid 857)
- 3993 kB: com.bbk.appstore (pid 7262)
- 3854 kB: com.mediatek.MediatekDM (pid 6281)
- 3667 kB: com.android.keychain (pid 7276)
- 3623 kB: com.baidu.map.location (pid 784)
- 3387 kB: com.mediatek.atci.service (pid 7110)
- 3359 kB: com.android.bbksoundrecorder (pid 746)
- 3265 kB: com.svox.pico (pid 7332)
- 3261 kB: com.android.defcontainer (pid 6448)
- Total PSS by OOM adjustment:
- 35958 kB: System
- 35958 kB: system (pid 463)
- 63631 kB: Persistent
- 26253 kB: com.android.systemui (pid 630)
- 10239 kB: com.android.phone (pid 706)
- 7074 kB: com.mediatek.bluetooth (pid 716)
- 7033 kB: android.process.acore (pid 1150)
- 5281 kB: com.android.bbkmusic (pid 1322)
- 4392 kB: com.mediatek.mdlogger (pid 725)
- 3359 kB: com.android.bbksoundrecorder (pid 746)
- 29945 kB: Foreground
- 20983 kB: com.android.settings (pid 7366)
- 8962 kB: android.process.media (pid 796)
- 27841 kB: Perceptible
- 9986 kB: com.tencent.qqpimsecure (pid 893)
- 9326 kB: com.iqoo.ime.service (pid 685)
- 4275 kB: com.mediatek.mobilelog (pid 7063)
- 4254 kB: com.android.contacts (pid 857)
- 14255 kB: A Services
- 7140 kB: com.ting.mp3.oemc.android:pushservice_v1 (pid 6502)
- 3854 kB: com.mediatek.MediatekDM (pid 6281)
- 3261 kB: com.android.defcontainer (pid 6448)
- 30518 kB: Home
- 30518 kB: com.bbk.launcher2 (pid 824)
- 27087 kB: B Services
- 7418 kB: com.sohu.sohuvideo:log_service (pid 6695)
- 6288 kB: com.sina.weibo.servant (pid 5979)
- 5435 kB: com.android.ActivityNetwork (pid 6621)
- 4559 kB: com.netease.pris:push (pid 7126)
- 3387 kB: com.mediatek.atci.service (pid 7110)
- 41627 kB: Background
- 7062 kB: com.sina.weibo (pid 2429)
- 5898 kB: com.eg.android.AlipayGphone (pid 3473)
- 5327 kB: com.tencent.mm (pid 6553)
- 4445 kB: com.android.mms (pid 6463)
- 4347 kB: com.baidu.map.location:remote (pid 843)
- 3993 kB: com.bbk.appstore (pid 7262)
- 3667 kB: com.android.keychain (pid 7276)
- 3623 kB: com.baidu.map.location (pid 784)
- 3265 kB: com.svox.pico (pid 7332)
- Total PSS by category:
- 145990 kB: Dalvik
- 44471 kB: Unknown
- 35557 kB: Other dev
- 24404 kB: .so mmap
- 14348 kB: .dex mmap
- 3830 kB: Other mmap
- 1214 kB: .apk mmap
- 524 kB: Native
- 424 kB: .ttf mmap
- 68 kB: Ashmem
- 32 kB: Cursor
- 0 kB: .jar mmap
- Total PSS: 270862 kB
- KSM: 0 kB saved from shared 0 kB
- 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]) 来查找,下图是某个程序的内存使用情况:

重点关注如下几个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息
这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。
方式二:使用 adb shell procrank 命令(failed)
- C:\Users\Administrator>adb shell procrank
- PID Vss Rss Pss Uss cmdline
- 463 61772K 61704K 36103K 32180K system_server
- 824 55208K 55112K 30643K 29204K com.bbk.launcher2
- 630 54492K 54376K 26423K 21896K com.android.systemui
- 7366 48596K 48492K 20979K 17016K com.android.settings
- ....
- 104 324K 324K 102K 100K /system/bin/6620_launcher
- 107 680K 680K 94K 52K /system/bin/mobile_log_d
- 1238 320K 316K 90K 88K sh
- 1229 316K 312K 90K 88K sh
- 1219 316K 312K 90K 88K sh
- ------ ------ ------
- 328033K 282552K TOTAL
- 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 中有如下代码可用:
- ProcessList() {
- MemInfoReader minfo = new MemInfoReader();
- minfo.readMemInfo();
- mTotalMemMb = minfo.getTotalSize()/(1024*1024);
- }
这个可以用于 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