Android 内存泄露
1.定义
Android (或 JVM)的内存泄露:短⽣命周期的对象被⻓⽣命周期的对象持有,从⽽导致短⽣命周期的对象不能被释放
2.垃圾回收机制
垃圾回收机制分为「引⽤计数法」和「可达性分析法」:
- 「引⽤计数法」
Python
,Object-C
,Swift
⽤⼀个计数器记录⼀个对象被引⽤的次数,如果引⽤的次数被减少到 0 那么说
明这个对象是垃圾 对象。
都是引⽤计数(引⽤计数有循环引⽤的问题) - 「可达性分析法」 Java
Jvm 通过⼀些 GC Roots 向下搜索,如果可以被 Gc Roots 引⽤到的对象,说明
这个对象不是垃圾对象,反之这个对象就算互相引⽤了也是垃圾对象。
哪些对象会被作为 GC Roots 呢?- 在线程栈中的局部变量,也就是正在被调⽤的⽅法,它⾥⾯的参数和局部变
量 - 存活的线程对象
- JNI 的引⽤
- Class 对象,因为 Android 加载 Class 后不会卸载 Class
- 引⽤类型的静态变量
- 在线程栈中的局部变量,也就是正在被调⽤的⽅法,它⾥⾯的参数和局部变
3.内存泄露导致的问题
内存泄漏并不会⻢上把程序搞挂掉。但是随着应⽤的使⽤,不能回收的垃圾对象会越来越多,就导致了 可⽤的内存越来越少,到最后应⽤就有可能在任何位置抛出OutOfMemoryError
,这种情况下,每次 OOM 错误堆栈都不同,就很难定位问题。
4.四⼤引⽤
- 强⼀点的引⽤
强引⽤——不会被垃圾回收 - 弱⼀点的引⽤
弱引⽤——可以通过 get() 获得引⽤对象,会被垃圾回收
软引⽤——可以通过 get() 获得引⽤对象,内存不⾜会被垃圾回收
虚引⽤——不能通过 get() 获得引⽤对象,会被垃圾回收
5.实现检测内存泄漏思路
将对象添加到弱引用中,当弱引⽤在引⽤对象被垃圾回收之前,会将引⽤放⼊它关联的队列中。
可以通过队列中是否有对应的引⽤来判断对象是否被垃圾回收了。
Android 内存泄露相关推荐
- Android内存泄露和GC机制
Android内存泄露和GC机制 本文先对Android内存垃圾回收机制进行介绍,之后对分析.定位内存泄露常用的测试方法进行总结,分享给大家. 一.Android内存垃圾回收(GC机制) 1.综述 A ...
- Android内存泄露测试不再蓝瘦,香菇
在进行Android内存泄露分析时,面对成千上万个对象,你是否蓝瘦,香菇?作为测试人员你在进行内存泄露测试之后,是否有勇气告诉开发同事程序已经没有内存泄露,可以放心发布了? 众所周知,内存泄露测试难点 ...
- 深入Android内存泄露
深入内存泄露 android应用层的内存泄露,其实就是java虚拟机的内存泄漏. (这里,暂不讨论C/C++本地内存的堆泄漏) 1.知识储备 1.Java内存模型 相关内存对象模型,参照博客精讲Jav ...
- Android内存泄露总结
内存泄露是如何产生的? 当一个对象已经不需要再使用了,本该被回收时,而有另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被回收的对象不能被回收而停留在堆内存中,这就产生了内存泄漏. ...
- JVM内存管理概述与android内存泄露分析
一.内存划分 将内存划分为六大部分,分别是PC寄存器.JAVA虚拟机栈.JAVA堆.方法区.运行时常量池以及本地方法栈. 1.PC寄存器(线程独有):全称是程序计数寄存器,它记载着每一个线程当前运行的 ...
- leaks Android内存泄露,Android LeakCanary 检测内存泄露
内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...
- Android 内存泄露分析
1 内存泄漏简介 内存泄漏是指内存空间使用完毕后无法被释放的现象.尽管Java有垃圾回收机制(GC),但是对于还保持着引用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们. 内存泄漏带来的危害: ...
- Android内存泄露抓取工具leakcanary
引言 "A small leak will sink a great ship." - Benjamin Franklin 概述 某些对象的生命周期有限,当它们的工作完成以后,将会 ...
- android内存泄漏检测,Android内存泄露检测之LeakCanary的使用
开始使用 目前为止最新的版本是2.3版本,相比于2.0之前的版本,2.0之后的版本在使用上简洁了很多,只需要在dependencies中加入LeakCanary的依赖即可.而且debugImpleme ...
最新文章
- jquery 获取Select option 选择的Text和Value
- 洛谷 P2420 让我们异或吧
- 《Linux》解决Linux端口被占用
- ITK:多路输出不同的类型
- 谷歌停止对android更新,谷歌停止华为使用安卓系统? 可能影响新系统版本更新?...
- Java知多少(9) import及Java类的搜索路径
- Docker与容器化-02-与镜像和容器操作相关的命令
- 数字图像处理的起源与应用
- [黑客光盘2009年更新]100张黑客光盘 数百G黑客资源~~~~~~~~~~~~~
- python用什么编译器-python用什么编译器
- 纯色图制作APP代码
- fluent udf dpm 捕集效率
- 【转】MT7688学习笔记(6)——OpenWrt下串口编程
- 狂神SpringSecurity学习笔记(基础)
- python中reversed与reverse的区别
- Linux 上开通1521 端口
- 如何在阿里云服务器构建discuz论坛(快速lamp架构)
- (zz)Lambda 表达式(C# 编程指南)
- 湛江C语言培训,湛江c语言编程学习,湛江学c语言编程报班,湛江学c语言编程自学好还是报班好...
- 【关于四足机器人那些事】腿部运动学建模(三维)