内容持续更新中......
内存相关
1 导致内存泄漏的原因有哪些?
内存泄漏的根本原因是:长生命周期的对象持有短生命周期的对象,短生命周期的对象就无法及时释放。
造成内存泄漏的原因有:
(1) 单例造成的内存泄漏
因为某些单例的初始化需要引入一个Context变量,在调用单例时会传入当前类的实例,而单例的对象是静态的,那么它将与Application拥有一样长的生命周期,如果当前类需要销毁,由于单例持有该类的引用,所以无法销毁,从而造成内存泄漏,代码如下:
public class Singleton{
private Singleton(Context context){
}
private static volatile Singleton instance = null;
public static Singleton getInstance(Context context){
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance = new Singleton(context);
}
}
}
return instance;
}
}
解决方法:使用getApplicationContext或者对Activity的引用使用弱引用。
(2)非静态内部类实例化一个静态的对象
非静态内部类隐性持有外部类的对象,如果将内部类实例化为一个静态对象,那么它将与Application拥有一样长的生命周期,如果外部类需要销毁,由于内部类持有该类的引用,所以无法销毁,从而造成内存泄漏,代码示例如下:
public class MyActivity extends Activity{
private static InnerClass innerclass = new InnerClass();
protected void onCreate(Bundle savedInstanceState){
super.onCreate(saveInstanceState);
}
private class InnerClass{
}
}
(3) Handler/Runnable造成的内存泄漏
Handler是一个非静态内部类,它隐性地持有外部类的对象。如果外部类需要结束,但消息队列中还有消息未处理完,则Handler不会释放外部类的对象,从而造成内存泄漏,代码示例如下:
Handler handler = new Handler(){
public void handleMessage(Message msg){
super.handleMessage(msg);
}
};
解决方法:
- 将Handler/Runnable改为静态的,如果是Handler,则在onDestroy中调用removeCallbackAndMessage(null)方法。
- 如果Handler/Runnable持有外部类的对象,则应该改成弱引用。
(4)资源未关闭造成的内存泄漏
如使用流资源,比如InputStream,Database等,还有就是BroadcastReceiver未取消注册等。
网友评论