一、内存泄漏

1、内存泄漏的现象和本质

内存泄漏(Memory Leak)是指某些对象已经不再使用了,但却无法被垃圾回收器回收内存,还一直占用着内存空间的现象,这就导致这一块内存泄露了。

而垃圾回收器无法回收某些对象的原因是因为这些对象还在被引用着。所以内存泄露的本质就是生命周期短的对象被生命周期长的对象引用了,导致生命周期短的对象无法及时被垃圾回收器回收。

2、内存泄漏的危害:

少量的内存泄漏并不会产生大的影响,当泄露的内存越来越大,可用的空闲内存越来越小,GC(垃圾回收机制)就会更容易被触发,GC进行时会停止其他线程的工作,因此有可能会造成界面卡顿等情况;

随着内存泄漏的堆积,大量的内存泄漏的堆积就可能会造成内存溢出。

3、Android 中涉及的内存泄漏

在 Android 应用程序当中,内存泄露要注意以下几个方面

(1)减少 static 使用:被 static 关键字修饰的成员变量的生命周期等于应用程序的生命周期,如果大量的使用的话,就会占据内存空间不释放,积少成多也会造成内存的不断开销;并且应该避免 static 成员变量引用资源耗费过多的实例(如 Context),若需引用 Context 则使用 Applicaiton 的 Context。

(2)避免非静态内部类(匿名内部类)持有外部类引用:非静态内部类(匿名内部类)默认会持有外部类的引用,而静态内部类则不会。Handler、AsyncTask(AsyncTask底层就是Handler)、多线程(实现 Runnable 接口、继承 Thread 类)的内存泄漏就属于这种,这种情况下应使用静态内部类 + 弱引用的方式。

(3)注册后及时反注册:BraodcastReceiver、Service、ContentObserver、EventBus等在注册后一定需要在对应的生命周期方法中进行反注册。

(4)资源对象使用完及时关闭 :数据库操作时的Cursor、读写文件时的IO流 等对象没有关闭;

(5)Bitmap 对象不在使用时应调用 recycle()释放内存:Bitmap 非常的耗费内存,多使用几个 Bitmap 很可能一下子就会超过 Java 堆的限制。因此,在用完 Bitmap 时,要 及时的 recycle 掉。recycle 并不能立即将 Bitmap 的内存释放,但是会在垃 圾回收器下一个工作的时机将这个 bitmap 回收。

(6)单例模式时不引用非 Application 的 Context:由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当引用 Activity 的 Context 的话,很会造成内存泄漏,所以单例模式中的 Context 必须引用 Application 的 Context 。

4、内存泄漏分析工具:

(1)静态代码分析工具 lint:可以用来检测部分会出现内存泄露的代码,平时编程注意 lint 提示的各种黄色警告即可。

(1)Android Studio 中自带的 Android Profiler:Android Studio 3.0 及更高版本中的 Android Profiler 取代了 Android Monitor 工具。

(2)开源的 leakcanary:。

二、内存溢出

内存溢出(Out Of Memoery:OOM)是指应用程序申请使用的内存超过的系统规定的最大值。Android系统对每个应用程序能够使用的内存都有一个最大值限定,当内存申请超出这阈值时就会出现OOM Crash。

1、Android中的内存溢出

(1)注意 ListView 的 item 复用:

早期使用的 ListView 需要手动进行 item 的复用,否则在快速滑动时生成大量的 ItemView,垃圾回收器又来不及回收内存,就可能出现OOM(这也是 ListView 被 RecyclerView 替代的主要原因);

(2)注意图片的加载:

a、加载多张图片时:对于加载多张图片,我们一般会使用三级缓存(内存缓存、本地缓存、网络缓存)来实现图片的加载。使用缓存可以使下一次加载时速度更快,所以在内存中保留着一定数量的图片缓存有助于下一次图片显示的速度更快。但是内存中不能保存太多的位图对象,所以一般使用 LRUCache 算法来保存内存中的图片,并且控制在一定的数量之内。

b、加载大长图:如果一张图片非常非常大,那么可能程序只要一加载它就会OOM,根本还没使用到三级缓存应用程序就崩溃了。所以对于大图片的显示需要特殊处理:虽然图片特别大, 但是这个图片所需要显示的控件有可能是很小的。我们可以先把图片的宽和高得到,再得到这张图片所需要显示的控件的宽高,就可以得到图片和控件的缩放比例了。最后根据缩放比例设置图片的采样率,以此来减小单张图片的内存占用。
    BitmapFactory.Options options = new BitmapFactory.Options();//只得到图片的大小,不去加载图片的内容options.inJustDecodeBounds = true;Bitmap boundBitmap = BitmapFactory.decodeFile(filePath,options);int imageWidth = boundBitmap.getWidth();int imageHeight = boundBitmap.getHeight();//计算 inSampleSize 的值 此时可以根据控件大小和图片大小来得到缩放比例 这里先写成 2options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一options.inJustDecodeBounds = false;Bitmap bitmap = BitmapFactory.decodeFile(filePath,options);

Android中的内存泄漏和内存溢出相关推荐

  1. JVM——内存泄漏与内存溢出

    内存泄漏与内存溢出 1. 面试题 什么是内存泄漏和什么是内存溢出 (陌陌) Java存在内存泄漏吗,内存泄漏的场景有哪些,如何避免(百度) Java 中会存在内存泄漏吗,简述一下?(猎聘) 内存泄漏是 ...

  2. python会不会出现内存泄露_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  3. 内存泄漏和内存溢出的关系和区别

    作者:不怕天黑_0819 链接:https://www.jianshu.com/p/61d34df7eabe 一.内存泄漏(memory leak) 1.内存泄漏是指程序中已动态分配的堆内存由于某种原 ...

  4. java 内存溢出 内存泄露_JVM——内存泄漏与内存溢出

    1.内存溢出 1.1 什么是Java的内存溢出? 在Java程序运行的过程中,经常会碰到以下错误:java.lang.OutOfMemoryError. 通俗讲,内存溢出是指程序在申请内存时,没有足够 ...

  5. 段错误、内存泄漏、内存溢出、堆溢出、栈溢出

    参考:内存泄漏.内存溢出.段错误.堆溢出.栈溢出 作者:焦木白 发布时间:2019-10-22 网址:https://blog.csdn.net/jiaomubai/article/details/1 ...

  6. java内存泄漏和内存溢出_Java和内存泄漏

    java内存泄漏和内存溢出 总览 术语"内存泄漏"在Java中的使用方式不同于在其他语言中使用的方式. 通用术语中的"内存泄漏"是什么意思,在Java中如何使用 ...

  7. Java应用程序中的内存泄漏和内存管理

    Java平台最突出的功能之一是其自动内存管理. 许多人错误地将此功能转换为Java中没有内存泄漏 . 但是,事实并非如此,我给人的印象是,现代Java框架和基于Java的平台,尤其是Android平台 ...

  8. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法

    Python内存泄漏和内存溢出的解决方法 发布时间:2020-10-30 23:08:34 来源:亿速云 阅读:92 作者:Leah 这篇文章将为大家详细讲解有关Python内存泄漏和内存溢出的解决方 ...

  9. python 内存溢出能捕获吗_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

  10. python内存泄漏解决方案_Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是 ...

最新文章

  1. 月薪没过20K的程序员要注意了!(文末送书)
  2. 专访阿里 iDST 语音组总监鄢志杰:智能语音交互从技术到产品,有哪些坑和细节要注意?
  3. 【Java8】堆栈/队列/数组/链表/红黑树,List/set子接口,hashcode/hashset,Map/内部接口,/统计字符个数,debug,斗地主,Collections,TreeSet
  4. 【代码刷题】排序算法总结(python实现)
  5. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题
  6. 内蒙古农大孙志宏教授证实超深度混合宏基因组测序能够对人类肠道微生物组中的低丰度物种进行基因组和功能表征...
  7. 某高校计算机系举办了一场,国家二级MS+OFFICE高级应用机试(操作题)-试卷25
  8. cycle/Pix2Pix 模型
  9. android(八)、触摸事件分发
  10. Unix环境高级编程(二)文件和目录
  11. 数据包络分析法(DEA) R实现
  12. echarts X轴和Y轴不对应(xAxis type time)的用法
  13. iOS蚂蚁森林的loading效果
  14. 二叉树任意两节点之间的最短距离
  15. 【CPU GPU TPU】机器学习扫盲篇
  16. NOIP学习之函数与过程抽象:91.质数的和与积
  17. ----- 前端面试题 -----
  18. zuk z2 Android7.0官方,联想ZUK Z2确定升级安卓7.0:官方曝光系统截图
  19. 使用RT-Thread Studio DIY 迷你桌面时钟(五)| 使用内置 Git 插件管理项目
  20. 程序员如何提高自己的编程水平?

热门文章

  1. HOG特征提取及应用详解
  2. gentoo 画框架图,流程图
  3. windows10使用4G模块上网
  4. 字节跳动面试真题:15个经典面试问题及回答思路,在线面试指南
  5. github结合tortoisGit使用sshkey,无需输入账号和密码
  6. 1.机器学习-matplotlib
  7. 【iOS】如何在UICollection中实现特殊翻页动画效果
  8. 对抗搜索之Alpha-Beta剪枝算法
  9. 验证码这样做,瞬间高出一个逼格
  10. 右键用vscode打开文件夹