1.内部类造成的内存泄露。
Activity对象是存在堆内存中的,而内部类静态实例是存放在方法区中,GC机制是回收
堆内存,所以,如回收不了被内部类静态实例持有的堆内存。
内部类在编译时,会生成与外部类的持有资源,这样就内部类就持有外部类。
可通过静态内部类解决上面的问题,静态内部类不持有外部类的资源,这也就是为什么静态内部类不能调用外部类的资源。
2.单例造成的内存泄露
如果单例持有的context,是activity的context,而单例是静态的,所以他的生命周期是跟application同样的,所以持有activity
的context,或其他资源,会让activity无法被回收。
3.Handler造成的内存泄露
当MainActivity结束时,未处理的消息持有handler的引用,而handler又持有它所属的外部类也就是 MainActivity的引用。这条引用关系会一直保持直
到消息得到处理,这样阻止了MainActivity被垃圾回收器回收,从而造成了内存泄漏。
解决方法,可将handler修改成静态内部类,并加上弱引用
4.资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,从而造成内存泄漏。
5.线程造成的内存泄漏
AsyncTask和Runnable都使用了匿名内部类,那么它们将持有其所在Activity的隐式引用。如果任务在Activity销毁之前还未完成,那么将导致Activity的内存资源无法被回收,从而造成内存泄漏。
可修改成静态内部类。
6.一些框架资源的使用习惯,没有及时回收,应该在周期内进行释放
7.集合类泄漏,集合如果只有添加机制,没有删除的处理,极其容易造成内存泄露
网友评论