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

  • 相关阅读:
    刷题的 vscodeleetcode
    一个简单的小程序演示Unity的三种依赖注入方式
    WCF服务端运行时架构体系详解[上篇]
    通过WCF扩展实现消息压缩
    通过“四大行为”对WCF的扩展[原理篇]
    [WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]
    [WCF权限控制]ASP.NET Roles授权[下篇]
    [WCF权限控制]通过扩展自行实现服务授权[提供源码下载]
    通过自定义ServiceHost实现对WCF的扩展[实例篇]
    [WCF权限控制]WCF自定义授权体系详解[实例篇]
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8505961.html
Copyright © 2020-2023  润新知