Android 内存泄漏和OOM分析(一)

本文探讨Android内存泄漏的原因、影响以及常见的5种泄漏类型:单例、非静态内部类、Handler、线程和资源未关闭。通过案例分析,提出了解决这些问题的预防措施,帮助开发者避免内存泄漏导致的OOM。
摘要由CSDN通过智能技术生成

这段时间在研究如何处理内存泄漏问题和防止OOM(内存溢出),关于内存泄漏和OOM分析,小司机在这里和大家探讨一下,有不同意见的大家都可以一起交流一下。

首先是内存泄漏:(这个是摘抄,加入了自己的理解)

在android开发中,内存泄漏是比较常见的问题,有过一些android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢?说完这句话我都笑了。

在android应用开发中,当一个对象已经不需要再使用了,本该被回收时,而另外一个正在使用的对象持有它的引用从而导致它不能被回收,这就导致本该被回收的对象不能被回收而停留在堆内存中,内存泄漏就产生了。
内存泄漏有什么影响呢?它是造成应用程序OOM的主要原因之一。由于android系统为每个应用程序分配的内存有限,当一个应用中产生的内存泄漏比较多时,会导致应用所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出而导致应用Crash。
了解了内存泄漏的原因及影响后,我们需要做的就是掌握常见的内存泄漏,并在以后的android程序开发中,尽量避免它。下面是5个android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。

一、 单例造成的内存泄漏

Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。

如下这个典例:

public class AppManager {
       private static AppManager instance;
       private Context context;
       private AppManager(Context context) {
        this.context = context;
      }
       public static AppManager getInstance(Context context) {
          if (instance == null) {
         instance = new AppManager(context);
         }
           return instance;
        }
    }

这是一个普通的单例模式,当创建这个单例的时候,由于需要传入一个Context,所以这个Context的生命周期的长短至关重要:

1、传入的是Application的Context:这将没有任何问题,因为单例的生命周期和Application的一样长 ;

2、传入的是Activity的Context:当这个Context所对应的Activity退出时,由于该Context和Activity的生命周期一样长(Activity间接继承 于Context),所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。

所以正确的单例应该修改为下面这种方式:

  public class AppManager {
       private static AppManager instance;
       private Context context;
       private AppManager(Context context) {
        this.context = context.getApplicationContext();
       }
        
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值