静态内部类与内存泄漏

 

 

        非静态内部类导致内存泄漏主要原因 : App可能会因为大量的内存泄漏导致内存耗尽,引发Crash,如果内存耗尽,App会由于内存空间不足,出现频繁的GC,每一次GC都是一个耗时阻塞操作,会造成设备卡顿。

       非静态内部类中创建了一个静态实例,导致该实例的生命周期和应用ClassLoader级别,又因为该静态实例会隐式持有其外部类的引用,所以导致其外部类无法正常释放,出现泄漏问题。

(classloader:用来动态加载某个class文件到内存当中,只有class被载入到内存中之后,才能被其他class所引用)

1.非静态内部类会对外部类存在一个隐式引用           

        非静态(匿名)内部类会持有外部类的引用,静态内部类中未持有外部类的引用。

2.非静态内部类中存在异步任务,可能导致其对应的外部类内存资源无法正常释放        

3.非静态内部类中创建了一个静态实例,会导致内存泄漏

解决思路:去掉隐式引用(静态(匿名)内部类),手动管理对象引用(修改静态内部类的构造方法,手动引入其外部类引用)当内存不可用时,不执行不可控代码(Android 可以结合智能指针 ,WeakReference包裹外部类实例)

总结:不是所有内部类只能使用静态内部类,只有在该内部类中的生命周期不可控的情况下,采用静态内部类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值