作为Android开发人员,我们或多或少都听说过内存泄漏。那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结。
在上一篇中描述到Handler引发的内存泄露。那么内存泄露又是怎么引起的呢。
关于内存泄露的定义,我是这么理解的 --》没有用的对象无法回收的现象就是内存泄露
如果程序发生了内存泄露,则会带来如下的问题
1.应用可用的内存减少,增加了堆内存的压力
2.减低了应用的性能,比如会触犯更频繁的GC
3.严重的时候可能会导致内存溢出错误,即OOM Error
java中的对象
当我们使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象
创建的对象可以被局部变量和类变量应用。
通常情况下,类变量的持有的对象生命周期最长,实例变量次之,局部变量最短。
垃圾回收器回收非存活的对象,并释放对应的内存空间。
Java中的GC
和c++不同,对象的释放不需要手动完成,而是由垃圾回收期自动完成。
垃圾回收器运行在JVM中
通常GC有两种算法:引用计数和GC根节点遍历
引用计数
每个对象有对应的引用计算器
当一个对象被引用(被复制给变量,传入方法中),引用计数器加1
当一个对象不被引用(离开变量作用域),引用计数器就会减1
基于这种算法的垃圾回收器效率较高
循环引用的问题引用计数算法的垃圾回收器无法解决。
主流的JVM很少使用基于这种算法的垃圾回收器实现。
GC根节点遍历
识别对象为垃圾从被称为GC根节点出发
每一个被遍历的强引用可到达对象,都会被标记为存活
在遍历结束后,没有被标记为存活的对象都被视为垃圾,需要后续进行回收处理
主流的JVM一般采用这种算法的垃圾回收器实现
更多的内存泄露原因以及解决方案:http://droidyue.com/blog/2016/11/23/memory-leaks-in-android/