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




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