您的位置:首页 > 运维架构 > Shell

adb shell dumpsys meminfo

2014-01-16 13:36 537 查看
在写 android 程序的时候,很容易出现 OOM ,而出现的时机大多数是由 Bitmap decode 引发的:

1
ERROR/AndroidRuntime(
16350
):
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
      我们知道,android程序内存一般限制在16M,当然也有24M的,而android程序内存被分为2部分:native和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
      用以下命令可以查看程序的内存使用情况:

1
adb
shell dumpsys meminfo $package_name 
or
 
$pid  
//使用程序的包名或者进程id
      用android自带的launcher程序为例:

01
run:
adb shell dumpsys meminfo com.android.launcher
02
<br>results:
03
Applications
Memory Usage (kB):
04
Uptime:
113017 Realtime: 113017
05
 
06
**
MEMINFO 
in
 
pid
129 [com.android.launcher] **
07
                    
native  
dalvik    other    total
08
            
size
:    
4572     3527      N/A     8099
09
       
allocated:    
4113     2684      N/A     6797
10
            
free
:     
406      843      N/A     1249
11
           
(Pss):    
1775     3572     3953     9300
12
  
(shared
dirty):     1448     4020     4792    10260
13
    
(priv
dirty):     1652     1308      708     3668
14
 
 
15
 
Objects
16
           
Views:       
0        ViewRoots:        0
17
     
AppContexts:       
0       Activities:        0
18
          
Assets:       
5    AssetManagers:        5
19
   
Local
 
Binders:      
14    Proxy Binders:       21
20
Death
Recipients:        0
21
 
OpenSSL
Sockets:        0
22
 
 
23
 
SQL
24
            
heap:      
64       memoryUsed:       64
25
pageCacheOverflo:       
4  largestMemAlloc:       50
26
 
 
27
 
DATABASES
28
  
Pagesize  
Dbsize  Lookaside  Dbname
29
      
1024       
4         48  launcher.db
       具体每一项代表什么,参考:http://stackoverflow.com/questions/2298208/how-to-discover-memory-usage-of-my-application-in-android#2299813,我们比较关心的是这2行:

1
             
native  
dalvik    other    total
2
     
size
:    
4572     3527      N/A     8099
3
allocated:    
4113     2684      N/A     6797
       其中size是需要的内存,而allocated是分配了的内存,对应的2列分别是native和dalvik,当总数也就是total这一列超过单个程序内存的最大限制时,OOM就很有可能会出现了。
       多数时候,发生OOM 都是在做一些跟图片相关的操作,以下提出一些建议尽量可以减少这种情况的发生:

view
sourceprint?

1
1
.decode
bitmap 的时候,尽量配置下Options,例如:inSameSize
2
2
.Bitmap使用完以后,调用
bitmap.recycle()来释放内存
3
3
.如果应用是基于图片的应用,尽量采用LazyLoad和DymanicRecycle
4
4
.decode
bitmap 的时候,将decode代码 
try
 
catch
 
出来,
catch
 
oom
error,避免程序crash,可以在
catch
里面做一些释放内存操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: