在談內存泄露之前,我們先談一談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]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