Android 查看内存使用情况

转:Android 查看内存使用情况

再看开发过程中,经常要通过内存的使用量来优化程序。

查看应用程序的命令:adb shell procrank

显示如下:

  PID      Vss      Rss      Pss      Uss  cmdline
  190   79560K   74736K   49624K   43604K  system_server
14335   55776K   55740K   31308K   26676K  com.android.launcher2
13074   47408K   47380K   24947K   22428K  com.android.settings
 7626   42060K   42028K   21312K   18432K  com.android.systemui
13948   32992K   32944K   11687K    9800K  android.process.acore
  283   25516K   25476K    8136K    7148K  com.android.phone


注:
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)




查看单个应用程序内存占用量的命令:adb shell dumpsys meminfo $包名 或者 $进程号 //当然你也可以adb shell进去后在输入余下部分。

显示如下:

Applications Memory Usage (kB):
Uptime: 70102403 Realtime: 104776333


** MEMINFO in pid 14335 [com.android.launcher2] **
                    native   dalvik    other    total
            size:    27576     8455      N/A    36031
       allocated:    26850     5311      N/A    32161
            free:      385     3144      N/A     3529
           (Pss):    13830     1134    16034    30998
  (shared dirty):     2980     1932    13776    18688
    (priv dirty):    13736      184    12504    26424
 
 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        3    AssetManagers:        3
   Local Binders:      162    Proxy Binders:       81
Death Recipients:        1
 OpenSSL Sockets:        0
 
 SQL
               heap:     3063         MEMORY_USED:     3063
 PAGECACHE_OVERFLOW:     2266         MALLOC_SIZE:       50
 
 DATABASES
      pgsz     dbsz   Lookaside(b)  Dbname
         1     2544            500  launcher.db


有了这些,调试应用程序的内存问题容易多了

转:点击打开链接

众所周知,在写 android 程序的时候,很容易出现 OOM ,而出现的时机大多数是由 Bitmap decode 引发的:
ERROR/AndroidRuntime(16350): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
用以下命令可以查看程序的内存使用情况:
adb shell dumpsys meminfo $package_name or $pid   //使用程序的包名或者进程id
用android自带的launcher程序为例:
run: adb shell dumpsys meminfo com.android.launcher
<BR>results:
Applications Memory Usage (kB):
Uptime: 113017 Realtime: 113017

** MEMINFO in pid 129 [com.android.launcher] **

                     native   dalvik    other    total
 
            size:     4572     3527      N/A     8099
 
       allocated:     4113     2684      N/A     6797
 
            free:      406      843      N/A     1249
 
           (Pss):     1775     3572     3953     9300
 
  (shared dirty):     1448     4020     4792    10260
 
    (priv dirty):     1652     1308      708     3668
 
 
 
Objects
 
           Views:        0        ViewRoots:        0
 
     AppContexts:        0       Activities:        0
 
          Assets:        5    AssetManagers:        5
 
   Local Binders:       14    Proxy Binders:       21
 
Death Recipients:        0
 
OpenSSL Sockets:        0
 
 
 
SQL
 
            heap:       64       memoryUsed:       64
 
pageCacheOverflo:        4  largestMemAlloc:       50
 
 
 
DATABASES
 
  Pagesize   Dbsize  Lookaside  Dbname
 
      1024        4         48  launcher.db

具体每一项代表什么,参考: http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813,我们比较关心的是这2行:
             native   dalvik    other    total
     size:     4572     3527      N/A     8099
allocated:     4113     2684      N/A     6797

其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。

       多数时候,发生OOM 都是在做一些跟图片相关的操作,以下提出一些建议尽量可以减少这种情况的发生:

1.decode bitmap 的时候,尽量配置下Options,例如:inSameSize
2.Bitmap使用完以后,调用 bitmap.recycle()来释放内存
3.如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle
4.decode bitmap 的时候,将decode代码 try catch 出来,catch oom error,避免程序crash,可以在catch里面做一些释放内存操作


推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值