Android 内存管理

zhchoutai · · 291 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

本文来自:博客园

感谢作者:zhchoutai

查看原文:Android 内存管理

291 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet