Android 内存管理

1.Activity中的对象生命周期勿大于Activity的生命周期,OOM示例代码如下:

          private static Drawable sBackground;        
             @Override   
            protected void onCreate(Bundle state) {    
                   super.onCreate(state);          
                   TextView label = new TextView(this);      
                   label.setText("Leaks are bad");          
                   if (sBackground == null) {      
                   sBackground = getDrawable(R.drawable.large_bitmap);    
                   }     
	   //sBackground持有对label的引用,label又持有对this的引
            label.setBackgroundDrawable(sBackground);
            setContentView(label)
}

2.生命周期长的内部类使用静态内部类;

过去常用的内存缓存实现是通过SoftReference或WeakReference(当内存空间不足时,此cache中的bitmap会被垃圾回收掉),但不建议这样做。从Android2.3(API等级9)垃圾收集器开始更积极收集软/弱引用,这使得它们缓存周期非常短且不可靠;

在Android 3.0(API等级11)之前,存储在native内存中的可见的bitmap不会被释放,可能会导致应用程序暂时地超过其内存限制并崩溃;

3.LruCache类很适合做图片缓存,它通过LinkedHashMap保持图片的强引用方式存储图片,当缓存空间超过设置定的限值时会释放掉早期的缓存,示例参考如下:

private final HashMap<String, Bitmap>mHardBitmapCache = new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY/ 2, 0.75f, true) { 
        @Override 
      protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) { 
            if (size() >HARD_CACHE_CAPACITY) { 
               //当map的size大于30时,把最近不常用的key放到mSoftBitmapCache中,从而保证mHardBitmapCache的效率
               mSoftBitmapCache.put(eldest.getKey(), newSoftReference<Bitmap>(eldest.getValue())); 
               return true; 
            } else 
                return false; 
        } 
    };

4.强引用已经提供了LRU算法(LruCache 类即采取LRU算法实现的缓存策略),可以移除最不经常使用的图片对象;

5.如果我们粗暴的把ThreadLocal设置null,而不调用remove()方法或set(null),那么就可能造成ThreadLocal绑定的对象长期也不能被回收,因而产出内存泄露。

你可能感兴趣的:(Android 内存管理)