内存泄漏原因

当应用不需要在使用某个对象时候,忘记释放为其分配的内存,导致该对象仍然保持被引用状态(当对象拥有强引用,GC无法回收),从而导致内存泄漏。

常见的内存泄漏源头

泄漏的源头有很多,有开源的第三方框架引起的;也有android系统自身造成的,比如webview的内存泄漏;还有一个是我们可以控制的,就是自身编码失误或者逻辑不严谨引起的内存泄漏。

常见的内存泄漏以及解决方案

  1. Context 引起的内存泄漏

    常见问题:

    这个是最常见的,因为Activity经常要用到上下文Context,很有可能Activity作为Context传递给某些类,Activity生命周期结束之后,某些类仍然存活并保持着该Activity的引用,保持引用就无法被回收。从而导致内存泄漏。

    解决方案:

  2. Static 静态变量

    常见问题:

    我们有时候会为了方便,设置某个Activity或者View为静态变量,但是你要知道,static变量是要贯穿整个应该的生命周期,就是意味着即使Activity销毁,static变量也不会销毁,所以,如果你把View或者Activity设置为静态变量,这会导致当前的Activity会一直存在,从而导致内存泄漏

    解决方案:

    1. 尽量避免使用static变量
    2. 如果非要使用的话,记得在界面销毁的时候,把静态变量也释放掉,简单说就是把静态变量置空,如staticView=null
  3. 非静态内部类、匿名内部类持有外部类的引用

    常见问题:

    我们在使用AsyncTash、Handler、TimerTask、Thread的时候,为了方便,直接new一个匿名内部类对象,殊不知我们在new一个的时候,编译器在编译的时候会自动为内部类的构造方法加上外包类的引用,所以这些匿名内部类会持有Activity,当这些匿名内部类处理非常耗时的操作时候,就算Activity生命周期结束,也不会被销毁,这就会造成内存泄漏。

    解决方案:

    1. 当Activity销毁的时候,对不需要的匿名内部类进行任务停止操作
    2. 使用静态内部类,静态内部类内部使用弱引用来引外外部类,这样当Activity销毁的时候,弱引用是可以被回收的
  4. 其他引起的泄漏

    1. 我们在使用系统服务的时候,比如注册了一些广播监听,在使用完后,要释放掉.
    2. 我们在给View绘制动画的时候,View被动画持有,而Activity又被View持有引用,导致Activity也无法释放。所以在Activity销毁时,调用animator.cancel()来停止动画

为了方便排查内存泄漏谷歌以及第三方厂家为我们提供了对应的内存分析工具,下面列出常用的三种内存泄漏分析工具。

常用分析工具

  1. MAT :eclipse时代的分析工具
  2. Android Monitor:Android Studio 自带的分析工具
  3. LeakCanary: Square开源的内存泄漏探测器

关于这三个工具的使用我将在接下来的《Android 常见的内存泄漏工具分析使用》里详细介绍他们的使用,有兴趣的同学可以先参考以下几篇博客。

参考

  • Android 内存泄漏分析心得
  • square/leakcanary
  • Getting started

Android常见的内存泄漏分析相关推荐

  1. 内存泄漏分析框架LeakCanary的使用与原理解析

    文章目录 1. 常见内存泄漏 1.1 "单例模式" 造成的内存泄漏 1.2 "静态实例" 造成内存泄漏 1.3 "Handler" 造成的内 ...

  2. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

  3. Android内存泄漏分析及调试

    2019独角兽企业重金招聘Python工程师标准>>> Android内存泄漏分析及调试 分类: Android2013-10-25 11:31 5290人阅读 评论(5) 收藏 举 ...

  4. Android 内存泄漏分析指北

    android 内存泄漏分析指北 简单来说内存泄漏就是当对象不再被应用程序使用,但是垃圾回收器却不能移除它们,因为它们正在被引用 java 垃圾回收介绍: Java 虚拟机运行所管理的内存包括以下几个 ...

  5. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  6. Android内存泄漏分析

    内存泄漏指的是程序中不再使用的对象对象由于某些原因无法被正常GC回收.对象没 有及时释放,就会占据宝贵的内存空间,因而导致后续分配内存的时候,内存空间不足出现OOM.如果无用对象占据的控件越大,那么可 ...

  7. [贝聊科技]使用Android Studio和MAT进行内存泄漏分析

    1.Java内存分配策略 Java 程序运行时的内存分配策略有三种:静态分配.栈式分配和堆式分配.对应的存储区域如下: 静态存储区(方法区):主要存放静态数据.全局 static 数据和常量.这块内存 ...

  8. Android内存泄漏分析及检测工具LeakCanary简介,androidui库

    Android内存优化是APP稳定运行的重要一环,开发过程中如果代码写的过于随意,很容易造成内存泄漏,多次累积之后,便会产生OOM,进而造成app崩溃.本文介绍了内存泄漏的相关知识和检测工具LeakC ...

  9. android释放acitity内存,Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

最新文章

  1. TVM性能评估分析(三)
  2. 【基础】利用thrift实现一个非阻塞带有回调机制的客户端
  3. 数论基础之快速幂(详细教程)
  4. SQL Server 查询数据库里所有表的行数
  5. linux mint 蓝牙,Linuxmint19蓝牙连接的问题
  6. 整合了一下网上的内容,excel工作簿全部公式转换为值
  7. NYOJ-会场安排问题(贪心)
  8. 计算机网络学习笔记(1. 什么是计算机网络?)
  9. 侯捷推荐的C++书单
  10. 直方图与直方图均衡化
  11. 74LS138译码器真值表以及快速计算方法
  12. java获取民族代码
  13. 专业思维导图软件 Mindjet MindManager 2021下载
  14. XIO: fatal IO error 25 (Inappropriate ioctl for device) on X server “localhost:11.0“
  15. 基于Apache APISIX,新浪微博API网关的定制化开发之路
  16. html数据线如何使用,揭秘数据线DIY详细步骤
  17. 【hadoop权威指南第四版】第五章MR应用【笔记+代码】
  18. 括号画家(括号匹配)
  19. python实现文本审核_百度AI文本审核API使用说明
  20. # 如何破429问题|x-kpsdk-ct|x-kpsdk-cd|snkrs bot ## nike 429| snkrs 429|nike 新盾 |snkrs 新盾|nike源码|snkrs 源码

热门文章

  1. ucloud对象存储装宝塔_使用UCloud优刻得云主机和宝塔面板快速搭建WP个人博客网站教程...
  2. 女性最容易动心的21种时刻
  3. 华为公开“一种芯片堆叠封装及终端设备”专利
  4. iPhone 14系列内部定价曝光:全版本或将涨价
  5. 华为Mate X2黄牛价已超两万,结果小伙子没拿稳,成全网首摔?
  6. 华为Mate 40 Pro维修价来了:这个部件最贵,够买一部顶级旗舰
  7. 苹果推出雷雳 3 Pro连接线:黑色编织设计 售价949元
  8. 中芯国际科创板上市发行价定为27.46元/股,募资或超500亿元
  9. 迪士尼前高管凯文·梅耶尔加盟字节跳动,出任COO
  10. 又一个国家5G基站被焚烧,这次理由是5G影响人类健康?