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绑定的对象长期也不能被回收。因而产出内存泄露。

【推广】 免费学中医,健康全家人
原文地址:https://www.cnblogs.com/zhchoutai/p/8505961.html