内存泄漏: 检测工具---leakcanary
① yi匿名类和非静态内部类相同,会持有外部类对象
1、单例模式造成的内存泄漏
由于单例的特性使得单例的生命周期和应用的生命周期一样长。如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,导致内存泄漏
2、Handler造成的内存泄漏
这种创建Handler的方式会造成内存泄漏,由于mHandler是Handler的非静态匿名内部类的实例,持有外部类Activity的引用。消息队列是在一个Looper线程中不断轮询处理消息,如果当前Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,而mHandler又持有Activity的引用,导致Activity的内存资源无法回收,引发内存泄漏。
3、线程造成的内存泄漏Thread (AsyncTask与之类似)
Runnable是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。
4、非静态内部类造成的内存泄漏
静态内部类默认会持有外部类的引用,
② 创建静态的实例
静态实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收,造成内存泄漏。
静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。
③ 资源未关闭造成的内存泄漏
BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏
④ 监听器没有注销造成的内存泄漏
在Android程序里面存在很多需要register与unregister的监听器,我们需要确保及时unregister监听器。
⑤ 集合中的内存泄漏
我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,
并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了
所以要在退出程序之前,将集合里的东西clear,然后置为null,再退出程序
① yi匿名类和非静态内部类相同,会持有外部类对象
1、单例模式造成的内存泄漏
由于单例的特性使得单例的生命周期和应用的生命周期一样长。如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,导致内存泄漏
2、Handler造成的内存泄漏
这种创建Handler的方式会造成内存泄漏,由于mHandler是Handler的非静态匿名内部类的实例,持有外部类Activity的引用。消息队列是在一个Looper线程中不断轮询处理消息,如果当前Activity退出时消息队列中还有未处理的消息或者正在处理消息,而消息队列中的Message持有mHandler实例的引用,而mHandler又持有Activity的引用,导致Activity的内存资源无法回收,引发内存泄漏。
3、线程造成的内存泄漏Thread (AsyncTask与之类似)
Runnable是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成, 那么将导致Activity的内存资源无法回收,造成内存泄漏。
4、非静态内部类造成的内存泄漏
静态内部类默认会持有外部类的引用,
② 创建静态的实例
静态实例的生命周期和应用的一样长,这就导致了该静态实例一直会持有该Activity的引用,导致Activity的内存资源不能正常回收,造成内存泄漏。
静态变量存储在方法区,它的生命周期从类加载开始,到整个进程结束。一旦静态变量初始化后,它所持有的引用只有等到进程结束才会释放。
③ 资源未关闭造成的内存泄漏
BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏
④ 监听器没有注销造成的内存泄漏
在Android程序里面存在很多需要register与unregister的监听器,我们需要确保及时unregister监听器。
⑤ 集合中的内存泄漏
我们通常把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,
并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。如果这个集合是static的话,那情况就更严重了
所以要在退出程序之前,将集合里的东西clear,然后置为null,再退出程序