美文网首页
Android内存泄露的几个点

Android内存泄露的几个点

作者: 泓汉 | 来源:发表于2020-04-13 16:50 被阅读0次

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.集合类泄漏,集合如果只有添加机制,没有删除的处理,极其容易造成内存泄露

相关文章

网友评论

      本文标题:Android内存泄露的几个点

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