Android的垃圾回收与内存泄露

在谈内存泄露之前,我们先谈一谈android的垃圾回收机制。


垃圾,即没有利用价值的东西。程序在运行时,需要对象来执行,这些对象都会占用内存空间。那么,当这些对象没有了利用价值,变成了垃圾,我们该如何对其进行回收?

这里,可以参看我的另一篇文章  JVM虚拟机以及垃圾回收机制学习总结

Android中使用的是Dalvik虚拟机,其使用的垃圾回收算法是Mark&Sweep,标记-清理算法。


如果这些垃圾不能被及时回收,就会造成内存泄露。

其实在Android中会造成内存泄露的情景无外乎两种:
  • 全局进程(process-global)的static变量。这个无视应用的状态,持有Activity的强引用的怪物。
  • 活在Activity生命周期之外的线程。没有清空对Activity的强引用。

检查一下你的项目中是否有以下几种情况:

  • Static Activities
  • Static Views
  • Inner Classes
  • Anonymous Classes
  • Handler
  • Threads
  • TimerTask
  • Sensor Manager


详情可以参考

[译]Android内存泄漏的八种可能(上)

[译]Android防止内存泄漏的八种方法(下)

[Android]Context泄露之谜:Handle & 内部类


下面推荐一款Android中检测内存泄露的工具:square公司推出的一款简单粗暴的检测内存泄漏的工具-- LeakCanary

下面的用法展示转自 http://www.open-open.com/lib/view/open1450669901261.html

上图就是LeakCanary的图标。当程序在debug的时候便会看见它了,但是当然release的时候就看不见了。

LeakCanary作为一个简单粗暴的工具,用法也相当简单

在build.gradle中引入LeakCanary

    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'  
        releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'  

一个是debug包,一个是release包的,从引入包的结构也能看出端倪

由于LeakCanary是测试整个app的内存泄露情况,所以你需要在你的application中启动它

    package com.zimo.guo;  
      
    import android.app.Application;  
      
    import com.squareup.leakcanary.LeakCanary;  
      
    /** 
     * Created by zimo on 15/8/7. 
     */  
    public class MyApplication extends Application {  
      
        @Override  
        public void onCreate() {  
            super.onCreate();  
            LeakCanary.install(this);  
        }  
    }  

ok,现在就可以测试程序中的内存泄露情况,直观明了

这么有逼格的工具,赶紧来试试吧,要想使你的app的内存泄露灰飞烟灭,try it




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章