Android检测内存溢出

Android应用中经常遇到的问题就是内存溢出。因此,该问题需要投入更多的精力!

Android 的SDK提供了两种命令procrank和dumpsys meminfo [pid] 来查看当前内存的使用情况

$procrank

PID      Vss      Rss      Pss      Uss cmdline                      

 935   68544K   42160K   19570K   15840K system_server               
 1002   37600K   35124K   14912K   12804K oms.home                    
 1221   33828K   33828K   12259K    9440K com.android.phone           
 2537   31916K   31916K   11510K    9324K com.android.Browser         
 2956   28768K   28768K    9034K    7152K com.hiapk.market            
...                                                                    
 854     268K     268K      89K      84K /system/bin/servicemanager  
 859     444K     444K      86K      28K /system/bin/sdm             
 920     268K     268K      85K      80K /system/bin/cbmon           
 883     404K     404K      84K      28K /system/bin/sdm             
 857     276K     276K      81K      76K /system/bin/debuggerd       
 
$ dumpsys meminfo 2537                                                 
Currently running services:                                             
 meminfo                                                              
-----------------------------------------------------------------      
DUMP OF SERVICE meminfo:                                               
Applications Memory Usage (kB):                                        
Uptime: 12697585 Realtime: 49787601                                    
                                                                       
** MEMINFO in pid 2537 [com.android.browser] **                         
                    native   dalvik    other    total                  
            size:     6432     4295      N/A    10727                  
       allocated:     5823     3142      N/A     8965                  
            free:           1153      N/A     1157                  
           (Pss):     3396     1858     6166    11420                  
 (shared dirty):     1260     4872      692     6824                  
    (priv dirty):     3332     1612     1608     6552                   
                                                                       
 Objects                                                               
           Views:       50        ViewRoots:                        
     AppContexts:             Activities:                        
          Assets:          AssetManagers:                        
   Local Binders:       14    Proxy Binders:       73                  
Death Recipients:                                                    
 OpenSSL Sockets:                                                   
                                                                       
 SQL                                                                   
            heap:      275          dbFiles:                        
       numPagers:         inactivePageKB:       82                  
    activePageKB:                                                   
                                                                      

可以写一个shell脚本收集系统状态信息:leak.sh
#!/system/bin/sh
while true; do
data >> ./procrank.log
procrank >> ./procrank.log
echo >> ./procrank.log
 
sleep 5
done
 
然后运行该脚本,收集系统信息后,根据收集到的系统信息判断是否可能存在内存溢出的问题。
(注:主要是查看 Uss列数据是否是处于增长状态)
如果是,则存在内存溢出的问题,这就需要我们对可能发生的溢出点进行定位。之后与网站的相同,借助Eclipse的一个插件mat,进行分析
首先获得占用内存最大的进程的快照,我们可以通过获得hprof文件实现。
如下:
$chmod 777 /data/misc
$kill -10 [pid]
这样将在/data/misc目录下生成一个带当前时间的hprof文件,比如
heap-dump-tm1275041385-pid2537.hprof
然后通过sdk提供的工具hprof-conv将hprof转换为mat可以读取的格式
$adb pull /data/mic/hprof文件 desktop/
$...sdk/tools$ hprof-conv   /data/misc/hprof文件  pidA.hprof
 
只有用mat打开进行分析。为了更准确定位,需要多次生成快照进行对比,还是可以学习到很多知识!
 
同时,SDK还提供了获得内存信息的api,详情如下:
 ActivityManager activityManager =(ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo info =new MemoryInfo();
activityManager.getMemoryInfo(info);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android开发中,内存溢出是指应用程序在申请的内存超过了系统可用内存的情况。这可能导致应用程序崩溃、运行缓慢或者被系统强制关闭。以下是一些常见导致内存溢出的情况和解决方法: 1. Bitmap内存溢出:在使用Bitmap处理图片时,如果没有正确地释放Bitmap对象,或者加载了过大的图片导致占用大量内存,就会发生内存溢出。解决方法包括使用合适的图片加载库(如Glide、Picasso),及时释放不再使用的Bitmap对象,或者对图片进行压缩处理。 2. 长时间占用内存的后台任务:如果应用程序中存在长时间运行的后台任务,而且这些任务没有及时释放占用的内存,就可能导致内存溢出。解决方法是在合适的时机停止或取消后台任务,并释放相关资源。 3. 内存泄漏:内存泄漏问题在上一个问题中已经提到过。如果应用程序中存在内存泄漏,持续占用内存而不释放,就会导致内存溢出。解决方法是检查代码,及时释放不再使用的对象引用,避免长时间持有上下文或其他对象的引用。 4. 大量对象的创建和销毁:如果应用程序频繁地创建和销毁大量对象,而没有及时释放,就会导致内存溢出。解决方法包括使用对象池或缓存来重复利用对象,减少对象的创建和销毁次数。 5. 不适当的资源使用:如果应用程序使用了大量的资源,如文件、数据库连接等,而没有正确地关闭或释放这些资源,就会导致内存溢出。解决方法是在不再需要使用资源的地方及时关闭或释放资源。 6. 大数据集的处理:如果应用程序需要处理大量的数据集,而没有进行分页或分批加载,就可能导致内存溢出。解决方法是采用分页加载或分批处理的方式,减少一次性加载大量数据的压力。 总之,要避免Android应用程序中的内存溢出问题,开发者应该注意及时释放占用的内存,避免内存泄漏和不适当的资源使用。合理管理Bitmap对象、后台任务、对象的创建和销毁,以及大数据集的处理都是预防内存溢出的重要方法。此外,使用工具进行内存分析和优化也是提高应用程序性能的有效方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值