zoukankan      html  css  js  c++  java
  • 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等)默认持有外部类的引用,如果非静态内部类的对象实例生命周期比外部类生命周期长(比如非静态内部类定义了一个静态的对象实例),外部类注销时就无法被系统回收,从而导致内存泄漏。解决方法是采用静态内部类+弱引用的方式。

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

  • 相关阅读:
    一波骚操作,我把 SQL 执行效率提高了 10,000,000 倍!
    如何优雅地根治null值引起的Bug!
    解锁新姿势:探讨复杂的 if-else 语句“优雅处理”的思路
    39 个奇葩代码注释,看完笑哭了。。。
    只要学会它,再多 Bug 也不怕
    SpringBoot 快速整合Mybatis(去XML化+注解进阶)
    Java 并发异步编程,原来十个接口的活现在只需要一个接口就搞定!
    微服务 2.0 技术栈选型手册
    如何设计 API 接口,实现统一格式返回?
    别在 Java 代码里乱打日志了,这才是打印日志的正确姿势!
  • 原文地址:https://www.cnblogs.com/linwenbin/p/11995493.html
Copyright © 2011-2022 走看看