一、内存泄露

java中的内存泄露是指一个无用对象持续占有内存或无用对象的内存得不到及时的释放,从而造成的内存控件的浪费称为内存泄露。

强引用(StrongReference):JVM 宁可抛出 OOM ,也不会让 GC 回收具有强引用的对象;

软引用(SoftReference):只有在内存空间不足时,才会被回的对象;

弱引用(WeakReference):在 GC(垃圾回收) 时,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存;

虚引用(PhantomReference):任何时候都可以被GC回收,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否存在该对象的虚引用,来了解这个对象是否将要被回收。可以用来作为GC回收Object的标志。

我们常说的内存泄漏是指new出来的Object无法被GC回收,即为强引用。

二、常见的内存泄露

1、资源未关闭 没有解除注册造成内存泄露

      资源性对象比如(Cursor,InputStream/OutputStream,File文件、View没有recyle等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。它们的缓冲不仅存在于 java虚拟机内,还存在于java虚拟机外。如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄漏。

2、Handler内存泄露

Handler不是静态内部类,会持有外部类(Activity)的一个引用。当Handler中有延迟的的任务或是等待执行的任务队列过长,由于消息持有对Handler的引用,而Handler又持有对其外部类的潜在引用,这条引用关系会一直保持到消息得到处理,而导致了Activity无法被垃圾回收器回收,而导致了内存泄露。1、使用弱引用解决;2、在OnDestroy中执行

mHandler.removeCallbacksAndMessages(null);

3、注册监听器的泄漏

        系统服务可以通过Context.getSystemService 获取,它们负责执行某些后台任务,或者为硬件访问提供接口。如果Context 对象想要在服务内部的事件发生时被通知,那就需要把自己注册到服务的监听器中。然而,这会让服务持有Activity 的引用,如果在Activity onDestory时没有释放掉引用就会内存泄漏。在OnDestroy中执行反注册。

4、集合中对象没清理造成的内存泄漏

把一些对象的引用加入到了集合容器(比如ArrayList)中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。退出程序之前,将集合里的东西clear,然后置为null,再退出程序。

5、单例内存泄露

单例的静态特性导致其生命周期同应用一样长。使用ApplicationContext,同时加弱引用。

6、Context使用不当

        使用ApplicationContext代替ActivityContext,因为ApplicationContext会随着应用程序的存在而存在,而不依赖于activity的生命周期;对Context的引用不要超过它本身的生命周期,慎重的对Context使用“static”关键字。Context里如果有线程,一定要在onDestroy()里及时停掉。

三、工具分析

Eclipse的MAT工具(MAT官网 https://www.eclipse.org/mat/)

具体使用方法详见:Android内存泄漏分析(MAT)

Android Studio + MAT 给你看真实项目实战的内存泄露分析

Android Studio - HPROF文件查看和分析工具

Android--内存泄露分析相关推荐

  1. JVM内存管理概述与android内存泄露分析

    一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...

  2. Android 内存泄露分析

    1 内存泄漏简介 内存泄漏是指内存空间使用完毕后无法被释放的现象.尽管Java有垃圾回收机制(GC),但是对于还保持着引用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们. 内存泄漏带来的危害: ...

  3. Android内存泄漏分析

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

  4. Android内存泄露测试不再蓝瘦,香菇

    在进行Android内存泄露分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄露测试之后,是否有勇气告诉开发同事程序已经没有内存泄露,可以放心发布了? 众所周知,内存泄露测试难点 ...

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

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

  6. Android内存泄露抓取工具leakcanary

    引言 "A small leak will sink a great ship." - Benjamin Franklin 概述 某些对象的生命周期有限,当它们的工作完成以后,将会 ...

  7. Android内存泄露和GC机制

    Android内存泄露和GC机制 本文先对Android内存垃圾回收机制进行介绍,之后对分析.定位内存泄露常用的测试方法进行总结,分享给大家. 一.Android内存垃圾回收(GC机制) 1.综述 A ...

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

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

  9. java内存泄露分析方案

    java内存泄露分析方案 - 准备工作 1.工具:Memory Analyzer Tool (mat); 1)安装Memory Analyzer Tool (mat) 2.原料:dump.hprof ...

  10. 一次.net托管内存泄露分析

    简介:一次.net托管内存泄露分析 最近协助分析了一个.net进程内存泄露的问题,过程分享给大家. 症状:客户的服务端.net进程出现分钟级的cpu抖动,接近100%后落回. 图1 分析:支持同学通过 ...

最新文章

  1. 2021年夏天找SAP新项目的几点感想
  2. 什么是.Net, IL, CLI, BCL, FCL, CTS, CLS, CLR, JIT
  3. 倒数秒跳转页面实现代码。
  4. MySQL5.6 Performance_schema
  5. python窗口居中_Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
  6. [原创软件]体验组批量加分工具
  7. uctools.php,discuz 论坛UCenter无法登录,闪退的终极8种解决办法
  8. callbackcallback()到底有什么涵义?
  9. ubuntu14 lamp环境下安装swoole1.8.6
  10. 【node】---记忆内容
  11. 包邮送几本Python和R语言的数据分析挖掘书籍
  12. oracle-rac实例不能启动 报ORA-03113
  13. java pdf 文字_Java如何使用Java向PDF页面中添加文本
  14. 解决QQ或TIM下载群文件网路失败或者网速贼慢的办法
  15. 【python基础】第02回 计算机基础2
  16. 行业知识图谱调查报告(一):知识图谱概述
  17. ESP32设备驱动-BMP180气压温度传感器驱动
  18. 「音箱」进化:小米、阿里向左,百度向右
  19. 论文阅读:Generating Abstractive Summaries with Finetuned Language Models
  20. 如何通过golang 连接阿里云的redis实例(golang带账号密码访问redis)

热门文章

  1. linux配置-ldl和-lc
  2. 09讲 | STM32单片机利用定时器实现按键采集
  3. Unity3D之自制小钟表
  4. 赤套の炎使い(デューイ) / 赤套(异时层水拳)
  5. 使用html+css+js实现弹球游戏
  6. 超简单的Jmeter连接mysql数据库,3分钟搞定!
  7. go语言生成linux桌面快捷,使用Go语言在MacOS创建一个自定义的命令行工具
  8. 华尔街日报创新大奖!
  9. 【论文精读】Geometric Structure Preserving Warp for Natural Image Stitching
  10. 收藏:近期已上线或即将上线的热门手游盘点,射击魔幻角色扮演?总有一款适合你