当前位置:操作系统 > 安卓/Android >>

[Android面试题-4] Android内存优化

题目:请简单说一下你在android开发过程中如何对内存进行优化。
 
分析:众所周知,Android应用程序是运行在java虚拟机之中,垃圾回收采用的是java当中的GC机制,由系统进行整体调度,开发者无法直接干预,因此在开发过程中对内存的合理使用就显得尤其重要。
 
1.对Bitmap的优化:
 
在Android应用中,最消耗内存的就是Bitmap的图片资源。而在android系统中,读取Bitmap时,分配给虚拟机中堆栈的大小只有8M,如果超出了,就会OOM(Out Of Memory)。
 
    a>要及时回收Bitmap,当Bitmap使用完毕后,执行如下代码:
 
[java] 
if(bitmap && !bitmap.isRecycle()){  
   bitmap.recycle();  
   bitmap = null;  
}  
system.gc();  
    注意,最后一句system.gc();只是请求系统尽快进行垃圾回收,而不能保证系统立即做出反应。
由于生成Bitmap对象是通过调用JNI接口实现的,释放同样也需要调用JNI接口。所以加载Bitmap对象到内存之后是包含两部分区域的,一个是java的部分,一个是C的部分。系统的GC机制在回收的时候只能回收java部分的内存,而不能释放C部分的内存,C部分的内存只能通过调用recycle()接口来释放。
 
那若不调用recycle()接口,是否就一定存在内存泄漏呢?也不是。当应用的进程被应用自己或者被系统杀死后,整个进程的内存就会被释放,当然也包含C的部分。
 
   b>捕获异常
 
[html] 
Bitmap bitmap = null;  
try{  
   bitmap = BitmapFactory.decodeFile(path);  
}catch(OutOfMemoryError e)  
{  
   // do something  
}  
if(!bitmap)  
   return default_bitmap;  
这样,在发生OOM的时候,应用就不会崩溃,而是会显示一张默认的图片。注意在catch的地方catch的是Error,而不是Exception。
   c>缓存通用的Bitmap对象
 
对于那种在应用中要多次重复用到的图片,可以在内存中只保留一个副本,即可以定义成全局变量或者静态变量。
 
  d>压缩图片
2.使用软引用和弱引用
 
Java将对象的引用分为四种级别,从而使程序能够更灵活的控制对象的生命周期。四种级别从高到低分别是:强引用,软引用,弱引用,虚引用。
 
a>强引用就是通常的用法,不再赘述。
 
b>软引用,如果一个对象只有软引用,那么当内存足够的时候,它和强引用的对象没区别;当内存不足时,系统会将它回收掉。
 
[html]  
private Map<String , SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>;  
public void addBmToCache(String path){  
  Bitmap bm = BitmapFactory.decodeFile(path);  
  SoftReference<Bitmap> softbm = new SoftReference<Bitmap>(bm);  
  imageCache.put(path, softbm);  
}  
  
public Bitmap getBmByPath(String path){  
  SoftReference<Bitmap> softbm = imageCache.get(path);  
  if(softbm == null)  
     return null;  
  Bitmap bm = softbn.get();  
  return bm;  
}  
 
 
c>弱引用,如果一个对象只有弱引用,那么在GC线程扫描过程中,一旦发现此类对象,无论内存是否足够,这个对象都将被回收。
 
软引用和弱引用的区别在于,弱引用的生命周期更短,随时有可能被回收;软引用只有在内存不足的时候才会被回收。
 
d>虚引用,形同虚设,主要是用来跟踪内存回收情况,必须和引用队列联合进行使用。
 
 
由于笔者水平有限,给各面试题提供的思路或代码难免会有错误,还请读者批评指正。另外,热忱欢迎读者能够提供更多、更好的面试题,本人将感激不尽。如有任何意见或建议,欢迎在评论中告知。
博主徐方磊对本博客文章享有版权。网络转载请注明出处http://blog.csdn.net/shishengshi。整理出版物请和作者联系。
补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,