1、内存溢出和内存泄漏的区别,常见内存泄漏
内存溢出:一个程序被分配的内存空间是一定的,当申请的内存容量不足时就会OOM
内存泄漏:使用过的对象被其他活动的或者使用的对象所持有,不能被gc回收,导致内存泄漏,内存泄漏累计起来会造成内存溢出
将非静态对象传给了静态对象持有,例如,将当前activity的context传递给单例模式的构造函数,一方面在使用时应该使用applicationContext,另一方面可以在设计单例模式时,将context转化为applictioncontext,或者不让使用者传入context
非静态的内部类引发的内存泄漏,非静态内部类会隐式持有外部对象,造成内存泄漏,可以将内部类设置为静态的,使用外部类时,可以使用弱引用
使用MVP架构时,由于presenter持有View对象,当view关闭时Presenter还在执行耗时操作违背销毁,造成View无法回收,可以使用若引用。
注册和反注册未成对使用,资源对象未及时关闭,如cursor,File,Bitmap等,集合对象未及时清理等。
2、handler造成的内存泄漏及解决办法
原因:使用handler一般用来解决子线程和主线程通讯问题,或者刷新UI,一般都会使用内部类甚至匿名内部类,内部类会隐性地持有外部类对象,例如activity关闭了,但子线程未跑完或者使用handler延时发送消息时,由于内部handler持有了activity对象,就会造成内存泄漏。
解决办法:关闭activity停止子线程,remove掉handler当中的消息,同时使用静态内部类,他不会持有外部类的对象,若要使用外部类的变量,可以以弱应用的形式持有外部类对象。