您的位置:首页 > 移动开发 > Android开发

Android 几种常见的内存泄漏

2017-11-13 17:21 423 查看

内存泄漏:

指无用对象不能被GC回收,从而持续占领内存。

场景:

1 . 单例:

当singleton为静态变量的时候,其生命周期与APP一样长,但如果该单例中持有其他对象的引用(通常为context对象)时,便会造成该对象不能被GC,从而导致内存泄漏。改进:使用context.getApplicationContext()。

2 . 内部类:

非静态内部类默认持有一个外部类对象的引用,当内部类中声明了静态变量(生命周期与APP一样)时,便会使外部类的对象不能被GC,导致内存泄漏。改进:将内部类声明为static。

3 . handler:

错误如下:

private  Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// ...
}
};


该handler为非静态内部类,但handler的生命周期通常比activity长,所以当activity退出时不能被回收,导致内存泄漏。

改进:1. 声明为静态的。 2 . 持有activity的弱引用(WeakReference)。

3 . handler.removeCallbacksAndMessages(null) 手动结束handler。

private static class myHandler extends Handler {
private WeakReference<Context> context;
public myHandler(Context context){
this.context = new WeakReference<Context>(context);
}
@Override
public void handleMessage(Message msg) {
// ...
}
};


4 . 避免使用static变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存泄露 android