1.定义

Android (或 JVM)的内存泄露:短⽣命周期的对象被⻓⽣命周期的对象持有,从⽽导致短⽣命周期的对象不能被释放

2.垃圾回收机制

垃圾回收机制分为「引⽤计数法」和「可达性分析法」:

  • 「引⽤计数法」 Python , Object-C , Swift
    ⽤⼀个计数器记录⼀个对象被引⽤的次数,如果引⽤的次数被减少到 0 那么说
    明这个对象是垃圾 对象。
    都是引⽤计数(引⽤计数有循环引⽤的问题)
  • 「可达性分析法」 Java
    Jvm 通过⼀些 GC Roots 向下搜索,如果可以被 Gc Roots 引⽤到的对象,说明
    这个对象不是垃圾对象,反之这个对象就算互相引⽤了也是垃圾对象。
    哪些对象会被作为 GC Roots 呢?

    1. 在线程栈中的局部变量,也就是正在被调⽤的⽅法,它⾥⾯的参数和局部变
    2. 存活的线程对象
    3. JNI 的引⽤
    4. Class 对象,因为 Android 加载 Class 后不会卸载 Class
    5. 引⽤类型的静态变量

3.内存泄露导致的问题

内存泄漏并不会⻢上把程序搞挂掉。但是随着应⽤的使⽤,不能回收的垃圾对象会越来越多,就导致了 可⽤的内存越来越少,到最后应⽤就有可能在任何位置抛出OutOfMemoryError ,这种情况下,每次 OOM 错误堆栈都不同,就很难定位问题。

4.四⼤引⽤

  • 强⼀点的引⽤
    强引⽤——不会被垃圾回收
  • 弱⼀点的引⽤
    弱引⽤——可以通过 get() 获得引⽤对象,会被垃圾回收
    软引⽤——可以通过 get() 获得引⽤对象,内存不⾜会被垃圾回收
    虚引⽤——不能通过 get() 获得引⽤对象,会被垃圾回收

5.实现检测内存泄漏思路

将对象添加到弱引用中,当弱引⽤在引⽤对象被垃圾回收之前,会将引⽤放⼊它关联的队列中。
可以通过队列中是否有对应的引⽤来判断对象是否被垃圾回收了。

Android 内存泄露相关推荐

  1. Android内存泄露和GC机制

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

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

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

  3. 深入Android内存泄露

    深入内存泄露 android应用层的内存泄露,其实就是java虚拟机的内存泄漏. (这里,暂不讨论C/C++本地内存的堆泄漏) 1.知识储备 1.Java内存模型 相关内存对象模型,参照博客精讲Jav ...

  4. Android内存泄露总结

    内存泄露是如何产生的? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...

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

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

  6. leaks Android内存泄露,Android LeakCanary 检测内存泄露

    内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...

  7. Android 内存泄露分析

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

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

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

  9. android内存泄漏检测,Android内存泄露检测之LeakCanary的使用

    开始使用 目前为止最新的版本是2.3版本,相比于2.0之前的版本,2.0之后的版本在使用上简洁了很多,只需要在dependencies中加入LeakCanary的依赖即可.而且debugImpleme ...

最新文章

  1. jquery 获取Select option 选择的Text和Value
  2. 洛谷 P2420 让我们异或吧
  3. 《Linux》解决Linux端口被占用
  4. ITK:多路输出不同的类型
  5. 谷歌停止对android更新,谷歌停止华为使用安卓系统? 可能影响新系统版本更新?...
  6. Java知多少(9) import及Java类的搜索路径
  7. Docker与容器化-02-与镜像和容器操作相关的命令
  8. 数字图像处理的起源与应用
  9. [黑客光盘2009年更新]100张黑客光盘 数百G黑客资源~~~~~~~~~~~~~
  10. python用什么编译器-python用什么编译器
  11. 纯色图制作APP代码
  12. fluent udf dpm 捕集效率
  13. 【转】MT7688学习笔记(6)——OpenWrt下串口编程
  14. 狂神SpringSecurity学习笔记(基础)
  15. python中reversed与reverse的区别
  16. Linux 上开通1521 端口
  17. 如何在阿里云服务器构建discuz论坛(快速lamp架构)
  18. (zz)Lambda 表达式(C# 编程指南)
  19. 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...
  20. 【关于四足机器人那些事】腿部运动学建模(三维)

热门文章

  1. 什么是哈希冲突?如何解决?
  2. Windows11 运行安卓子系统 教程
  3. 怎么看自己的maven本地仓库在那里
  4. Linux学习笔记(22.2)——基于IIC + Regmap + IIO的AP3216C的设备驱动
  5. Linux的系统安全及管理
  6. 【二叉树】重建二叉树
  7. math_角函数反三角函数诱导公式三角/反三角恒等式
  8. css常见的几种布局
  9. 进程和线程的区别是什么
  10. ImageMagick简介、GraphicsMagick、命令行使用示例