Android中如何查看内存


///

// 该文是学习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:它表示 当系统剩余内存低于好多时就看成低内存运行
下面是我运行的结果:


法三:在代码中使用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的函数

主观的认识必须有客观的实践,才能加深印象。
下面就是我的实践结果:

法五:使用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)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值