Android 中内存泄漏总结

内存泄漏

一个不会被使用的对象,因为另一个正在被使用的对象持有该对象的引用,所以不能被正常回收,使它停留在堆内存中。

使用静态变量导致内存泄漏

静态变量属于静态存储方式存储,其存储空间为内存中静态区域(在静态存储区内分配存储单元)。程序运行期间一直占用这些存储空间。

单例模式导致内存泄漏

Android 中单例的生命周期和 Application 的生命周期一样,如果在Activity 被单例所持有,那么 activity 就没办法被回收

属性动画导致内存泄漏

如果开启一个属性动画,一直让它播放。会导致内存泄漏

  • 解决办法就是 在 onDestroy() 中给属性动画取消 。 onCancel()

WebView 导致内存泄漏

在 onDestroy 中,重置 webView

使用非静态内部类导致内存泄漏

摘自 MG屠夫

  • 1, 非静态内部类的线程生命周期不可控,能否回收完全受线程生命周期决定。如果线程是永久运行的,那么将永远无法回收,就永远无法释放。因为在 Java 中线程是垃圾回收机制的根源,在运行系统中 DVM 虚拟机总会硬件持有所有运行状态的进程的引用,结果导致处于运行状态的线程将永远无法回收

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

解决方案

  • 去除隐式引用通过静态内部类去除隐式引用。比如 Android 中的点击事件的处理。要使用静态内部类创建出来,不要使用匿名非静态匿名内部类创建。
  • 手动管理对象引用
  • 使用若引用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值