///
// 该文是学习http://blog.csdn.net/hudashi/article/details/7050897写的文章,融合了一些自己的想法以及实践的结果。
android中查询应用程序内存有很多方式,但是每种方法结果测得的内存情况可能都不一样。
法一:Running services
使用android内置的Setting查看。
法二:使用使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)查看
ActivityManager.getMemoryInfo()主要是用于得到当前系统剩余内存的及判断是否处于低内存运行。
实例1:
private void displayBriefMemory() {
final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(info);
Log.i(tag,"系统剩余内存:"+(info.availMem >> 10)+"k");
Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);
Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");
}
ActivityManager.getMemoryInfo()是用ActivityManager.MemoryInfo返回结果,而不是Debug.MemoryInfo,他们不一样的。
ActivityManager.MemoryInfo只有三个Field:
availMem:表示
系统剩余内存
lowMemory:它是boolean值,表示
系统是否处于低内存运行
hreshold:它表示
当系统剩余内存低于好多时就看成低内存运行
下面是我运行的结果:
这里我按照Robin Hu的方法实验了一下,得出如下结果:“
他还补充了几点:
1. 我们可以通过"adb shell dumpsys meninfo &package_name" 来打印多有的进程内存占用的详细信息。
2. Debug的getMemoryInfo获取当前App的信息,ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[] pids)可以获取所有运行着进程的信息。
可以先通过. List< ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() 得到当前所有运行的进程信息。 获取进程信息列表,该列表里面有进程的ID,然后通过该ID就可以获取程序MemroyInfo了。
法四:使用Debug的getNativeHeapSize (),getNativeHeapAllocatedSize (),getNativeHeapFreeSize ()方法。
该方式只能得到Native堆的内存大概情况,数据单位为字节
下面是我运行的结果:
法三:在代码中使用Debug的getMemoryInfo(Debug.MemoryInfo memoryInfo)或ActivityManager的MemoryInfo[] getProcessMem
dalvikPrivateDirty
:
The private dirty pages used by dalvik。
dalvikPss
:
The proportional set size for dalvik.
dalvikSharedDirty
:
The shared dirty pages used by dalvik.
nativePrivateDirty
:
The private dirty pages used by the
native heap
.
nativePss
:
The proportional set size for the native heap.
nativeSharedDirty
:
The shared dirty pages used by the
native heap.
otherPrivateDirty
:
The private dirty pages used by everything else.
otherPss
:
The proportional set size for everything else.
otherSharedDirty
:
The shared dirty pages used by everything else.
Android和Linux一样有大量内存在进程之间进程共享。某个进程准确的使用好多内存实际上是很难统计的。
因为有paging out to disk(换页),所以如果你把所有映射到进程的内存相加,它可能大于你的内存的实际物理大小。
dalvik:是指
dalvik所使用的内存。
native:是被native堆使用的内存。应该指使用C\C++在堆上分配的
内存。
other:是指除
dalvik和
native使用的内存。但是具体是指什么呢?至少包括在C\C++分配的非堆内存,比如分配在栈上的内存。puzlle!
private:是指私有的。非共享的。
share:是指共享的内存。
PSS:
实际使用的物理内存(比例分配共享库占用的内存)
Pss:它是把共享内存根据一定比例分摊到共享它的各个进程来计算所得到进程使用内存。网上又说是
比例分配共享库占用的内存,那么至于这里的共享是否只是库的共享,还是不清楚。
PrivateDirty:它是指非共享的,又不能换页出去(
can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使你的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
SharedDirty:参照
PrivateDirty我认为
它应该是指共享的,又不能换页出去(
can not be paged to disk )的内存的大小。比如Linux为了提高分配内存速度而缓冲的小对象,即使所有共享它的进程结束,该内存也不会释放掉,它只是又重新回到缓冲中而已。
这里我按照Robin Hu的方法实验了一下,得出如下结果:“
他还补充了几点:
1. 我们可以通过"adb shell dumpsys meninfo &package_name" 来打印多有的进程内存占用的详细信息。
2. Debug的getMemoryInfo获取当前App的信息,ActivityManager的MemoryInfo[] getProcessMemoryInfo(int[] pids)可以获取所有运行着进程的信息。
可以先通过. List< ActivityManager.RunningAppProcessInfo> getRunningAppProcesses() 得到当前所有运行的进程信息。 获取进程信息列表,该列表里面有进程的ID,然后通过该ID就可以获取程序MemroyInfo了。
法四:使用Debug的getNativeHeapSize (),getNativeHeapAllocatedSize (),getNativeHeapFreeSize ()方法。
该方式只能得到Native堆的内存大概情况,数据单位为字节
static long
getNativeHeapAllocatedSize()
Returns the amount of allocated memory in the native heap.
返回的是当前进程navtive堆中
已使用的内存大小
static long
getNativeHeapFreeSize()
Returns the amount of free memory in the native heap.
返回的是当前进程navtive堆中已经
剩余的内存大小
static long
getNativeHeapSize()
Returns the size of the native heap.
返回的是当前进程navtive堆本身
总的内存大小
示例代码:
Log.i(tag,"NativeHeapSizeTotal:"+(Debug.getNativeHeapSize()>>10));
Log.i(tag,"NativeAllocatedHeapSize:"+(Debug.getNativeHeapAllocatedSize()>>10));
Log.i(tag,"NativeAllocatedFree:"+(Debug.getNativeHeapFreeSize()>>10));
注意
:DEBUG中居然没有与上面相对应的关于dalvik的函数。
主观的认识必须有客观的实践,才能加深印象。
下面就是我的实践结果:
Returns the size of the native heap.
返回的是当前进程navtive堆本身
总的内存大小
示例代码:
Log.i(tag,"NativeHeapSizeTotal:"+(Debug.getNativeHeapSize()>>10));
Log.i(tag,"NativeAllocatedHeapSize:"+(Debug.getNativeHeapAllocatedSize()>>10));
Log.i(tag,"NativeAllocatedFree:"+(Debug.getNativeHeapFreeSize()>>10));
注意
:DEBUG中居然没有与上面相对应的关于dalvik的函数。
主观的认识必须有客观的实践,才能加深印象。
下面就是我的实践结果:
主观的认识必须有客观的实践,才能加深印象。
下面就是我的实践结果:
法五:使用dumpsys meminfo命令。
例子用法:huanghao@Mtn:~$ adb shell dumpsys meminfo hh.apis
帖出我的实践结果:
法六:使用 "adb shell procrank"命令
继续我实践结果:
注意1:这里的PSS和方式四PSS的total并不一致,有细微的差别。为什么呢?这是因为procrank 命令和meminfo命令使用的内核机制不太一样,所以结果会有细微差别
注意2:这里的Uss 和方式四的Priv Dirtyd的total几乎相等.他们似乎表示的是同一个意义。但是现在得到的关于它们的意义的解释却不太相同。难道这里Private的都是dirty(这里指不能换页)? Puzzle!
法7:使用"adb shell cat /proc/meminfo" 命令。
MemTotal :可供系统和用户使用的总内存大小 (它比实际的物理内存要小,因为还有些内存要用于radio, DMA buffers, 等).
MemFree:剩余的可用内存大小。这里该值比较大,实际上一般Android system 的该值通常都很小,因为我们尽量让进程都保持运行,这样会耗掉大量内存。
Cached: 这个是系统用于文件缓冲等的内存. 通常systems需要20MB 以避免bad paging states;。当内存紧张时,the Android out of memory killer将杀死一些
background
进程,以避免他们消耗过多的cached RAM ,当然如果下次再用到他们,就需要paging. 那么是说
background进程的内存包含在该项中吗?
方式8:用“adb shell ps -x”命令
该方式主要得到的是内存信息是VSIZE 和RSS。
huanghao@Mtn:~$ adb shell ps -x
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 812 588 c13108de 0805773e S /init (u:3, s:292)
root 2 0 0 0 c1269c44 00000000 S kthreadd (u:2, s:0)
root 3 2 0 0 c12523dc 00000000 S ksoftirqd/0 (u:0, s:4)
root 6 2 0 0 c1293cfc 00000000 S migration/0 (u:0, s:0)
root 7 2 0 0 c12947c5 00000000 S watchdog/0 (u:6, s:0)
root 9 2 0 0 c1293cfc 00000000 S migration/1 (u:0, s:0)
root 11 2 0 0 c12523dc 00000000 S ksoftirqd/1 (u:0, s:3)
root 12 2 0 0 c12947c5 00000000 S watchdog/1 (u:4, s:0)
root 13 2 0 0 c1265c85 00000000 S cpuset (u:0, s:0)
root 14 2 0 0 c1265c85 00000000 S khelper (u:0, s:0)
root 15 2 0 0 c1265c85 00000000 S suspend (u:0, s:0)
root 17 2 0 0 c12e2765 00000000 S sync_supers (u:0, s:0)
root 18 2 0 0 c12e1d9c 00000000 S bdi-default (u:0, s:0)
root 19 2 0 0 c1265c85 00000000 S kblockd (u:0, s:0)
root 20 2 0 0 c157ab7b 00000000 S khubd (u:0, s:0)
root 21 2 0 0 c1630435 00000000 S kinteractiveup (u:0, s:16)
root 23 2 0 0 c1265c85 00000000 S msic_adc (u:0, s:0)
root 24 2 0 0 c1295b6c 00000000 S irq/16-msic_adc (u:6, s:0)
root 27 2 0 0 c12d9b6e 00000000 S kswapd0 (u:0, s:0)
root 28 2 0 0 c1333a5f 00000000 S fsnotify_mark (u:0, s:0)
root 29 2 0 0 c1265c85 00000000 S crypto (u:0, s:0)
root 40 2 0 0 c1265c85 00000000 S kthrotld (u:0, s:0)
root 41 2 0 0 c1265c85 00000000 S 0000:00:00.2 (u:0, s:0)
root 43 2 0 0 c1265c85 00000000 S 0000:00:02.4 (u:0, s:0)
root 50 2 0 0 c1265c85 00000000 S penwell_otg_que (u:0, s:0)
root 51 2 0 0 c1265c85 00000000 S penwell_otg_chr (u:0, s:0)
root 52 2 0 0 c1265c85 00000000 S kpsmoused (u:0, s:0)
root 54 2 0 0 c1295b6c 00000000 S irq/318-ft5x0x_ (u:0, s:208)
root 55 2 0 0 c1295b6c 00000000 S irq/319-apds930 (u:0, s:225)
root 56 2 0 0 c1295b6c 00000000 S irq/316-lis3dh_ (u:0, s:1)
root 57 2 0 0 c1295b6c 00000000 S irq/286-msic_oc (u:0, s:0)
root 58 2 0 0 c1645ed7 00000000 S mmcqd/0 (u:0, s:438)
root 59 2 0 0 c1265c85 00000000 S binder (u:0, s:0)
root 60 2 0 0 c1295b6c 00000000 S irq/67-msic_pow (u:0, s:0)
root 62 2 0 0 c1265c85 00000000 S ssp_transfer_da (u:0, s:0)
root 63 2 0 0 c1265c85 00000000 S sep_sec-ewq (u:0, s:0)
root 64 2 0 0 c1265c85 00000000 S ifx_transfer_da (u:0, s:0)
root 65 2 0 0 c1295b6c 00000000 S irq/66-i2s ssp (u:0, s:0)
root 66 2 0 0 c1265c85 00000000 S sst_mad_wq (u:0, s:0)
root 67 2 0 0 c1265c85 00000000 S sst_post_msg_wq (u:0, s:0)
root 68 2 0 0 c1265c85 00000000 S sst_process_msg (u:0, s:0)
root 69 2 0 0 c18350cf 00000000 S krfcommd (u:0, s:0)
root 70 2 0 0 c1265c85 00000000 S sst_proces_repl (u:0, s:0)
root 71 2 0 0 c1295b6c 00000000 S irq/30-intel_ss (u:0, s:92)
root 72 2 0 0 c1295b6c 00000000 S irq/65-i2s ssp (u:0, s:0)
root 73 2 0 0 c1265c85 00000000 S f_mtp (u:0, s:0)
root 74 2 0 0 c15b4f48 00000000 S file-storage (u:0, s:0)
root 75 2 0 0 c1265c85 00000000 S ttm_swap (u:0, s:0)
root 77 2 0 0 c1295b6c 00000000 S irq/17-intel_md (u:0, s:0)
root 78 2 0 0 c16d072f 00000000 S dsi_esd (u:0, s:0)
root 80 2 0 0 c1295b6c 00000000 S irq/307-max170x (u:0, s:0)
root 82 2 0 0 c1265c85 00000000 S pvr_timer (u:0, s:0)
root 83 2 0 0 c1295b6c 00000000 S irq/19-msic_aud (u:0, s:0)
root 84 1 552 272 c13108de 0805773e S /sbin/ueventd (u:0, s:15)
root 85 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p2- (u:0, s:0)
root 86 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 88 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p8- (u:0, s:0)
root 89 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 92 2 0 0 c1322e0d 00000000 S flush-179:0 (u:43, s:78)
root 94 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p6- (u:0, s:0)
root 95 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 96 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p3- (u:0, s:0)
root 97 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 101 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p9- (u:0, s:57)
root 102 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 103 2 0 0 c13c0933 00000000 S jbd2/mmcblk0p7- (u:3, s:117)
root 104 2 0 0 c1265c85 00000000 S ext4-dio-unwrit (u:0, s:0)
root 110 2 0 0 c1265c85 00000000 S atomisp 0000:00 (u:0, s:0)
root 111 2 0 0 c1265c85 00000000 S hci0 (u:0, s:0)
system 118 1 1616 416 c1661093 400730ca S /system/bin/servicemanager (u:2, s:13)
root 119 1 5800 1020 ffffffff 4009cccd S /system/bin/vold (u:2, s:6)
root 121 1 388 384 c13108de 08048a60 S /sbin/watchdogd (u:0, s:1)
root 123 1 11264 1720 ffffffff 400fdccd S /system/bin/netd (u:22, s:77)
root 124 1 1776 520 c173c78d 4007815f S /system/bin/debuggerd (u:0, s:0)
root 125 1 313740 46808 ffffffff 4007228c S zygote (u:294, s:115)
bluetooth 126 1 2712 1340 c13108de 400cb8c6 S /system/bin/dbus-daemon (u:2, s:3)
root 127 1 1708 592 c17d0ecb 40079d1a S /system/bin/installd (u:19, s:75)
keystore 128 1 3476 1052 c173c78d 4007915f S /system/bin/keystore (u:1, s:0)
drm 129 1 20724 5464 ffffffff 401520ca S /system/bin/drmserver (u:7, s:4)
media 130 1 73428 17276 ffffffff 400fb0ca S /system/bin/mediaserver (u:461, s:536)
gps 132 1 10536 2408 ffffffff 40072d1a S /system/bin/navd (u:0, s:33)
root 134 2 0 0 c1265c85 00000000 S cfg80211 (u:0, s:0)
root 137 2 0 0 c1265c85 00000000 S pvr_workqueue (u:0, s:0)
root 141 2 0 0 c1265c85 00000000 S wl12xx_wq (u:0, s:0)
root 142 2 0 0 c1295b6c 00000000 S irq/258-wl12xx (u:1, s:1645)
bluetooth 145 1 1704 520 c13108de 4007b8c6 S /system/bin/uim (u:0, s:0)
root 149 1 1636 716 c1202730 40066fb6 S /system/bin/sh (u:4, s:20)
media_rw 150 1 1788 668 c13d09dd 40065d1a S /system/bin/sdcard (u:26, s:143)
root 153 1 5372 700 ffffffff 402f5d1a S /system/bin/crashlogd (u:3, s:1)
root 154 1 2308 1240 c13108de 4006e28c S /system/bin/logcat (u:877, s:1655)
shell 155 1 5796 384 ffffffff 0805c9ec R /sbin/adbd (u:412, s:3848)
system 335 125 499292 115824 ffffffff 400720ca S system_server (u:32545, s:13586)
wifi 407 1 5824 2140 c13108de 4006628c S /system/bin/wpa_supplicant (u:107, s:363)
bluetooth 410 1 4300 2020 c13108de 4011d8c6 S /system/bin/bluetoothd (u:1, s:3)
u0_a64 416 125 369364 73024 ffffffff 40073813 S com.android.systemui (u:23318, s:2553)
u0_a34 513 125 328004 45212 ffffffff 40073813 S com.android.inputmethod.latin (u:448, s:63)
radio 531 125 335712 38624 ffffffff 40073813 S com.android.phone (u:154, s:36)
u0_a46 541 125 321908 33100 ffffffff 40073813 S com.android.musicfx (u:48, s:9)
u0_a35 554 125 389256 90844 ffffffff 40073813 S com.android.launcher (u:6048, s:889)
u0_a41 604 125 337500 42816 ffffffff 40073813 S com.wsandroid.suite.intelempg (u:323, s:52)
u0_a13 740 125 358556 45776 ffffffff 40073813 S com.google.process.gapps (u:542, s:96)
u0_a40 1019 125 329488 35916 ffffffff 40073813 S com.google.android.apps.maps:FriendService (u:30, s:8)
u0_a78 1301 125 325948 38124 ffffffff 40073813 S com.als.usagetimelines (u:2415, s:980)
system 1321 125 324928 32884 ffffffff 40073813 S com.ti.gps.supl.app (u:8, s:3)
u0_a40 2223 125 349452 40984 ffffffff 40073813 S com.google.android.apps.maps (u:48, s:9)
log 2566 1 1452 456 c14dc15c 40065d1a S /system/bin/logwrapper (u:0, s:0)
dhcp 2567 2566 1828 764 c13108de 400678c6 S /system/bin/dhcpcd (u:0, s:2)
u0_a15 3011 125 325860 34224 ffffffff 40073813 S com.android.defcontainer (u:268, s:215)
u0_a60 3053 125 368984 75144 ffffffff 40073813 S com.intel.android.gallery3d (u:79, s:24)
u0_a1 3272 125 367536 50944 ffffffff 40073813 S android.process.acore (u:162, s:36)
u0_a30 3306 125 322148 32048 ffffffff 40073813 S com.intel.empg.ieswidget (u:12, s:3)
u0_a52 3337 125 347824 40540 ffffffff 40073813 S com.android.vending (u:156, s:35)
u0_a55 3373 125 341272 45872 ffffffff 40073813 S com.google.android.apps.plus (u:188, s:29)
shell 3417 155 1628 676 c1202730 40066fb6 S /system/bin/sh (u:0, s:0)
shell 3419 3417 3032 1844 c13108de 4006e28c S logcat (u:242, s:780)
u0_a67 3426 125 346960 41412 ffffffff 40073813 S com.google.android.googlequicksearchbox (u:47, s:11)
root 4323 2 0 0 c1265e77 00000000 S kworker/0:2 (u:2, s:362)
u0_a40 5037 125 342192 41208 ffffffff 40073813 S com.google.android.apps.maps:GoogleLocationService (u:155, s:16)
system 5703 125 362916 69100 ffffffff 40073813 S com.android.settings (u:645, s:98)
u0_a13 5872 125 325100 34056 ffffffff 40073813 S com.google.android.gms (u:6, s:5)
root 5968 2 0 0 c1265e77 00000000 S kworker/u:3 (u:0, s:201)
u0_a56 5971 125 323352 32352 ffffffff 40073813 S com.android.quicksearchbox (u:5, s:5)
u0_a17 6344 125 324760 34920 ffffffff 40073813 S android.process.media (u:10, s:8)
root 6404 2 0 0 c1265e77 00000000 S kworker/1:1 (u:0, s:33)
root 6429 2 0 0 c1265e77 00000000 S kworker/0:1 (u:0, s:15)
root 6633 2 0 0 c1265e77 00000000 S kworker/0:0 (u:0, s:74)
root 6957 2 0 0 c1265e77 00000000 S kworker/u:1 (u:0, s:49)
system 7011 125 321736 33168 ffffffff 40073813 S com.android.keychain (u:3, s:4)
u0_a26 7033 125 322060 32140 ffffffff 40073813 S com.google.android.partnersetup (u:11, s:3)
u0_a53 7052 125 322592 30580 ffffffff 40073813 S com.svox.pico (u:2, s:3)
u0_a40 7082 125 332532 36548 ffffffff 40073813 S com.google.android.apps.maps:LocationFriendService (u:23, s:4)
u0_a80 7098 125 359420 66012 ffffffff 40073813 S hh.apis (u:116, s:19)
root 7204 2 0 0 c1265e77 00000000 S kworker/1:0 (u:0, s:0)
root 7321 2 0 0 c1265e77 00000000 S kworker/u:0 (u:0, s:0)
root 7387 149 1836 460 c126ec19 4006eccd S sleep (u:0, s:0)
root 7403 2 0 0 c1265e77 00000000 S kworker/1:2 (u:0, s:0)
system 7437 125 322796 32072 ffffffff 40073813 S com.intel.cmpc.td.guardian.service:remote (u:8, s:4)
u0_a65 7450 125 333596 37964 ffffffff 40073813 S com.intel.cmpc.td.agent:remote (u:61, s:12)
shell 7520 155 1628 676 c1202730 40066fb6 S /system/bin/sh (u:0, s:0)
shell 7522 7520 1844 572 00000000 4006dd1a R ps (u:1, s:5)