参考文章
1、Android性能优化-内存泄漏(上)
http://huangjunbin.com/2017/03/22/Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96-%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%88%E4%B8%8A%EF%BC%89/
Android性能优化-内存泄漏(下)
http://huangjunbin.com/2017/03/22/Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96-%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%88%E4%B8%8B%EF%BC%89/
Context引起的内测泄漏
1)错误的单例模式
public class Singleton {
private static Singleton instance;
private Context mContext;
private Singleton(Context context) {
this.mContext = context;
}
public static Singleton getInstance(Context context) {
if (instance == null) {
instance = new Singleton(context);
}
return instance;
}
}
即使Activity被销毁掉,但因为它的引用还存在于一个Singleton中,就不可能被GC掉
2)View持有Activity引用
public class MainActivity extends Activity {
private static Drawable mDrawable;
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
ImageView iv = new ImageView(this);
mDrawable = getResources().getDrawable(R.drawable.ic_launcher);
iv.setImageDrawable(mDrawable);
}
}
有一个静态的Drawable对象当ImageView设置这个Drawable时,ImageView保存了mDrawable的引用,而ImageView传入的this是MainActivity的mContext,因为被static修饰的mDrawable是常驻内存的,MainActivity是它的间接引用,MainActivity被销毁时,也不能被GC掉,所以造成内存泄漏。