美文网首页
Android内存泄漏

Android内存泄漏

作者: couriravant | 来源:发表于2020-02-11 16:53 被阅读0次

    如果一个存活时间长的对象持有另一个存活时间短的对象就会导致存活时间短的对象在GC时被认定可达而不能被及时回收也就是我们常说的内存泄漏。

    1.单例模式造成的泄漏:

    在activity生命周期中使用单例模式的时候 ,当Activity A生命周期结束,但静态类里面却还存在activity的引用(mContext),这样Activity就会占用的内存就一直不能回收,而静态类的对象也不会再被使用,从而导致内存泄漏;

    2.集合造成的泄漏:

    集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减。比如我们都喜欢通过 HashMap 做一些缓存之类的事,这种情况就很容易导致泄漏问题。

    3.匿名内部类/非静态内部类导致内存泄漏:

    匿名内部类/非静态内部类和异步线程,默认都会持有外界的引用,如果前者突然因为某种原因要finish,或者activity突然挂掉 , 但是系统判断还有对象持有,那么就会造成内存泄漏。

    4.线程造成的内存泄漏:

    当我们在使用线程的时候,一般都使用匿名内部类,而匿名内部类会对外部类持有默认的引用,当Acticity关闭之后如果现成中的任务还没有执行完毕,就会导致Activity不能正常回收,造成内存泄漏。

    5.资源未关闭造成的内存泄漏:

    对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的代码,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

    6.handler泄漏:

    对于handler泄漏其实是由于消息队列持有对handler的引用,而handler又持有activity的隐式引用,这个引用会保持到消息得到处理,而导致activity无法被垃圾回收器进行回收,而导致内存泄漏 ,使用static+WeakReference可以解决内存泄漏问题,不过不写也无所谓 , 不加static的默认会在handler构造函数加上activity这个参数,只要handler没有被回收,就会泄露。加static目的是为了防止泄露,为什么会泄露,就是因为没回收,没回收是因为还引用着。只有postDelayed的时候才会有泄露问题,因为delayed的时候activity的引用还保持着,所以只要delayed完了就能回收了,大多数情况下根本不必用加static。

    refer:https://www.jianshu.com/p/6cf427ab0085

    相关文章

      网友评论

          本文标题:Android内存泄漏

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