Android中的内存泄漏

来源:互联网 发布:443端口攻击 编辑:程序博客网 时间:2024/06/05 21:16

   作为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/


1 0
原创粉丝点击