【Android】面试题精选

作者: 秀叶寒冬 | 来源:发表于2019-07-02 10:04 被阅读9次

内容持续更新中......

内存相关

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未取消注册等。

相关文章

网友评论

    本文标题:【Android】面试题精选

    本文链接:https://www.haomeiwen.com/subject/gmgacctx.html