Android中常见的内存泄漏及解决

96
真不错呀
2018.05.03 19:07* 字数 691

1.Handler引起的内存泄漏

原因:该线程持有Handler的引用,而Handler也持有Activity的引用,这就导致了Activity不再使用时,GC回收不了Activity

解决:Handler持有的引用最好使用弱引用,在Activity被释放的时候要记得清空Message,取消Handler对象的Runnable



2.单例模式引起的内存泄漏

我还没见过所谓的单例模式,去网上查了一下,找到了个比较好的范例:


单例模式的目的是使得类的一个对象成为系统中的唯一实例,这样做有什么意义呢?我觉得意义就在于节约内存。举个例子,任务管理器只能存在一个,如果多个任务管理器共存,显示的东西都是一模一样的,存在了多个只能导致过多的内存占用

原因:构建该单例的一个实例时需要传入一个Context,如果此时传入的是Activity,由于Context会被创建的实例一直持有,当Activity进入后台或者开启设置里面的不保留活动时,Activity会被销毁,但是单例持有它的Context引用,Activity没法销毁

解决:对于生命周期比Activity长的对象,要避免直接引用Activity的context,可以考虑使用ApplicationContext


3.非静态内部类创建静态实例引起的内存泄漏

原因:非静态的内部类会自动持有外部类的引用,创建的静态实例就会一直持有的引用

解决:可以考虑把内部类声明为静态的


4.非静态匿名内部类引起的内存泄漏

原因:如果匿名内部类被异步线程使用,可能会引起内存泄漏

解决:可以考虑把内部类声明为静态的


5.资源对象没有关闭引起的内存泄漏

原因:资源性对象比如Cursor、File、Bitmap、视频等,系统都用了一些缓冲技术,在使用这些资源之后没有关闭

解决:处理完资源对象的逻辑记得关闭,最好是形成习惯现写一开一关


6.集合对象没有及时清理引起的内存泄漏

原因:如果集合是static、不断的往里面添加东西、又忘记去清理,肯定会引起内存泄漏

解决:集合里面的东西、有加入就应该对应有相应的删除


顺带一提,垃圾回收不能解决内存泄露

Android
Web note ad 1