这几天在做codereview,不看不知道,一看吓一跳。 检查到几个比较严重的内存泄露,主要就是单例模式引起的。
// single instance
private static NormalDBOpenHelper mAMDb = null;
public synchronized static NormalDBOpenHelper getInstance(Context context) {
if (mAMDb == null) {
mAMDb = new NormalDBOpenHelper(context);
}
return mAMDb;
}
private NormalDBOpenHelper(Context context) {
super(context, DBNAME, null, VERSION);
}
1、当一个变量被声明为static时,它就不是对象的变量了,而是类变量。
2、静态变量什么时候被销毁? 当进程死了,或者所在的上下文从Classloader里面卸载了,才会被销毁。
我们再结合上面两点:
1、mAMDb 是 NormalDBOpenHelper 的类变量
2、NormalDBOpenHelper 只有在进程被杀死的时候才会被销毁
也就是说在此期间,它会一直持有context,所以就会造成内存泄露。
那么,我们该如何解决?
1、针对需要上下文的,我们可以是用 ApplicationContext,这个是伴随着整个进程存活一直存在的,所以就无所谓内存泄露。
2、如果需要上下文,那么我们就要考虑是不是一定非得使用单例模式。