本文章主要从软引用和弱引用的角度探讨Bitmap的内存优化。 java
Java从JDK1.2以后就将对象的引用分为4个级别:强引用、软引用、弱引用、虚引用。具体的概念不详述了。 缓存
软引用:当内存空间足够的时候,GC就不会回收它,内存空间不足了,就会回收。 优化
弱引用:GC工做过程当中,一旦发现了弱引用对象,无论内存足够与否,都会回收它的内存。 spa
因此,从上述能够看出,软引用和弱引用的根本区别在于:只具备弱引用的对象拥有更短暂的生命周期,可能随时被回收。 code
当缓存大量的Bitmap时,比较容易形成OOM,因此能够考虑使用软引用技术来避免这个问题的发生。 对象
//首先定义一个HashMap,保存软引用对象 private Map<string, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>(); //保存Bitmap的软引用到HashMap public void addBitmapToCache(String path) { //强引用的Bitmap对象 Bitmap bitmap = BitmapFactory.decodeFile(path); //软引用的Bitmap对象 SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap); //添加该对象到map中使其缓存 imageCache.add(path, softBitmap); } //获取缓存对象 public Bitmap getBitmapByPath(String path) { //从缓存中取软引用的Bitmap对象 SoftReference<Bitmap> softBitmap = imageCache.get(path); //判断是否存在软引用 if(softBitmap == null) { return null; } //取出Bitmap对象,若是内存不足Bitmap被回收,将取得空 Bitmap bitmap = softBitmap.get(); return bitmap; }
使用软引用以后,在OOM异常发生以前,这些缓存的图片资源空间都会被释放掉,从而能够避免程序由于OOM而Crash。 生命周期
何时使用软引用,何时使用弱引用? 图片
建议:若是只想避免OOM,则使用软引用;若是该对象常常被使用,则使用软引用;若是想尽快回收一些占用内存比较大的对象,则使用弱引用; 内存