Android内存溢出及内存泄漏原因进解析

 更新时间:2020年08月06日 11:31:16   作者:志不坚者智不达  
这篇文章主要介绍了Android内存溢出及内存泄漏原因解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

内存溢出(Out Of Memory):Android系统中每一个应用程序可以向系统申请一定的内存,当申请的内存不够用的时候,就产生了内存溢出。

内存泄漏:当某个对象不再被使用,即不再有变量引用它时,该对象占用的内存就会被系统回收。当某个对象不再被使用,但是在其他对象中仍然有变量引用它时,该对象占用的内存就无法被系统回收,从而导致了内存泄漏。

当内存泄漏过多时,可用内存空间会减少,应用程序申请的内存不够用,就会导致内存溢出。

内存溢出原因:

1.内存泄漏过多。

2.内存中加载的数据量超过内存的可用量。

3.集合类(用于存储对象的引用)中有对对象的引用,使用完后未清空。

4.申请的内存不够。

5.死循环或者循环产生过多对象实例,导致大量内存被消耗。

。。。

内存泄漏原因:

1.资源对象没有关闭:

(1)注册广播接收器后没有调用unregisterReceiver()方法注销广播接收器。

(2)打开文件流之后没有调用close()方法关闭文件流。

(3)数据库游标cursor使用完后没有调用close()方法关闭游标。

(4)图片资源Bitmap使用完之后没有调用recycle()方法回收。

。。。

2.生命周期长的对象持有生命周期短的对象的引用,导致生命周期短的对象内存无法被回收:

(1)单例模式或者静态成员变量的生命周期和应用程序的生命周期相等,当需要引用Context时,如果传入的是Activity的Context,Activity需要被销毁时就无法被回收。解决方法是传入Application的Context,因为Application的Context生命周期等于应用程序的生命周期。

(2)非静态内部类(匿名内部类、Handler等)默认持有外部类的引用,如果非静态内部类的对象实例生命周期比外部类生命周期长(比如非静态内部类定义了一个静态的对象实例),外部类注销时就无法被系统回收,从而导致内存泄漏。解决方法是采用静态内部类+弱引用的方式。

总结:内存泄漏产生的原因主要有两种:一种是资源对象在使用完后没有进行关闭操作。另一种是生命周期长的对象引用了生命周期短的对象,导致生命周期短的对象即使不再使用但仍然无法被系统回收。根本原因在于需要被回收的内存资源没有被系统回收。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Flutter Animation实现缩放和滑动动画效果

    Flutter Animation实现缩放和滑动动画效果

    这篇文章主要为大家详细介绍了Flutter Animation实现缩放和滑动动画效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android源码解析之属性动画详解

    Android源码解析之属性动画详解

    在手机上去实现动画效果算是件比较炫酷的事情,自Android 3.0版本开始,系统给我们提供了一种全新的动画模式,属性动画(property animation),它的功能非常强大,弥补了之前补间动画的一些缺陷,几乎是可以完全替代掉补间动画了。本文就详细介绍了Android中的属性动画。
    2017-02-02
  • Android读取properties配置文件的实例详解

    Android读取properties配置文件的实例详解

    这篇文章主要介绍了Android读取properties配置文件的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • RecyclerView下拉刷新上拉加载

    RecyclerView下拉刷新上拉加载

    本文主要介绍了RecyclerView下拉刷新上拉加载的具体实现代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Android中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下
    2015-01-01
  • Android自定义日历Calender代码实现

    Android自定义日历Calender代码实现

    这篇文章主要为大家详细介绍了Android自定义日历Calender实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • android随机生成圆形云标签效果

    android随机生成圆形云标签效果

    这篇文章主要为大家详细介绍了android随机生成圆形云标签效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android高效加载大图、多图解决方案 有效避免程序OOM

    Android高效加载大图、多图解决方案 有效避免程序OOM

    这篇文章主要为大家详细介绍了Android高效加载大图、多图解决方案,有效避免程序OOM,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • Android中TelephonyManager用法实例

    Android中TelephonyManager用法实例

    这篇文章主要介绍了Android中TelephonyManager用法,结合实例形式分析了TelephonyManager类的功能,使用技巧与相关注意事项,需要的朋友可以参考下
    2016-03-03
  • Android自定义View获取注册验证码倒计时按钮

    Android自定义View获取注册验证码倒计时按钮

    这篇文章主要介绍了Android自定义View获取验证码倒计时按钮的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10

最新评论