一、Java内存泄漏基础知识
内存泄漏 :该被释放的对象没有被释放,一直被某些对象或者某些实例持有,导致不能垃圾回收。
1.java内存的分配策略 :
1)静态存储区 :主要存放静态数据、全局变量等等。程序编译的时候已经分配好了,在静态存储区中存储的变量,在整个程序运行期间都存在。
2)栈区 :在方法执行的时候,方法体内的局部变量会在栈上创建内存空间,并在方法执行结束后,这些变量和持有的内存会被自动释放。因为栈内存分配运算内置于处理器当中,所以效率很高,但是栈区的内存空间容量有限。
3)堆区 :动态内存分配,通常就是new对象出来的内存,不使用的时候将会由java的内存回收器来负责回收。
2.java是如何管理内存的 :
需要通过关键词new为对象申请内存空间,所有的对象都是在堆中分配内存空间的。内存的释放是由GC垃圾回收器来执行的。内存的分配是由开发人员完成的,内存的释放是由GC自动完成的。
3.java中的内存泄漏 :
内存泄漏是指无用对象(不再使用的对象)持续占有内存或者无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄漏。
二、Android内存泄漏基础知识
1.单例 : 应持有Application的引用,而不是Activity的引用。
2.匿名内部类 :匿名内部类应该设置成静态的,不然会一直持有外部类的引用。
3.Handler :应自定义一个静态Handler,在该Handler的内部持有传入Content的弱引用。
private MyHandler mHandler = new MyHandler(this);
private static class MyHandler extends Handler {
private WeakReference<Context> reference;
public MyHandler(Context context) {
reference = new WeakReference<>(context);
}
@Override
public void handlerMessage(Message msg) {
MainActivity activity = (MainActivity) reference.get();
if(activity != null) {
activity.mTextView.setText("");
}
}
}
4.避免使用static变量 :可以使用懒加载。
5.资源未关闭造成的内存泄漏 :如文档、游标、Bitmap等资源,在Activity要销毁的时候,需关闭和注销这些资源。
6.AsyncTask造成的内存泄漏 :可以在onDestroy()方法中调用AsyncTask的cancel方法。