概念:内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。
单例
这种应该属于新手最容易出现的错误,因为类中会封装一些需要用到Context的方法,于是想当然的就把Activity或者Activity的Context直接传入,结果就是这个单例一持有传入的Activity无法得到释放.
public class Singleton { private Context mContext; private volatile static Singleton instance = null; private Singleton(Context mContext) { this.mContext = mContext; } public static Singleton getInstance(Context mContext) { if (instance == null) { synchronized (Singleton.class) { instance = new Singleton(mContext); } } return instance; } }
解决方案
- 传入的Activity使用
mContext.getApplicationContext()
</br></br></br>
匿名内部类
这是Java中方便又恐怖的一个地方。因为你不注意就可以导致内存泄漏比如下面这个。首先内部有一个100秒的延迟操作,同时这个匿名内部类最终指向是Activity导致finish后
GC依然认为它是有引用的所以导致无法回收。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { handler.postDelayed(runable,100000); } });
解决方案
- 匿名类改为静态内部类</br></br></br>
Handler Thread TimerTask
这种发生内存泄漏问题与上面有类似之处比如:
handler.postDelayed(runable,100000);
一段延迟代码让Activity的任务没有结束结果无法回收
解决方案
- 在Destory中记得赋为null或停止任务并且使用静态修饰</br></br></br>
集合类、静态集合类
使用集合类最容易长期持有对象,如果不对集合Remove或者Clear则会持有到集合的生命周期结束。
解决方案
- 及时的remove 和 clear</br></br></br>
监听器、各种连接、注册 及解决
有些监听器生命周期很长。�需要remove 当你不知道它生命周期时最简单的看看有没有删除监听方法如果有就使用至少不会错,一些连接比如数据库没有关闭也会造成泄漏,在finally中要记得关闭,注册与解除一定是成对出现的记住这个就够了
网友评论