五分鐘體驗內存泄露檢測LeakCanary

昨天感冒彼宠,大晚上10點就睡了,本來今天打算休息養(yǎng)傷的趣席,誰知道大下午4點的時候傳來噩耗有必解bug兵志,只能頂著傷病來到公司了。廢話少說了宣肚,今天咱們來體驗一下LeakCanary的內存檢測功能啦想罕。LeakCanary這個庫咋用啊,調用肯定是很簡單啦霉涨,在Application類里面調用一下LeakCanary.install(this);就完事了按价,所以說搞應用是真他媽的簡單。下面五分鐘計時開始笙瑟!

1.下載工程楼镐,工程的github網(wǎng)址:https://github.com/square/leakcanary 又是square公司的,記住這個公司往枷,這個公司太牛逼了框产,什么okhttp,rxjava都是這公司搞的错洁,就沒見中國有什么創(chuàng)造秉宿。

網(wǎng)址.png

2.導入到Android studio中去,導入后是這個狗樣

Android studio.png

3.然后編譯了屯碴,有時會報sdk不在描睦,你就下載sdk嘛,有時還會報下面

Error:(21, 0) CreateProcess error=2, 系統(tǒng)找不到指定的文件导而。 <a href="openFile:D:\androidstdioSDK\workspace\leakcanary\leakcanary-android\build.gradle">Open File</a>

貌似是要配git的環(huán)境變量忱叭,我懶得配,直接把這句還有java中引用的地方通通刪掉今艺,就向下圖

通通刪掉.png

4.然后假設你編譯過了韵丑,編譯不過你找我。開始執(zhí)行虚缎,會給你裝兩個apk撵彻,分別來自leakcanary-sample和leakcanary-android文件夾
安裝后是這個鳥樣。

兩個apk.png

然后打開左邊LeakCanarySample那個apk遥巴,英文看的懂不千康?看不懂就別看了,這篇文章也別看了,英語都不會,還是中國人嗎蝇刀?英文意思际乘,就是讓你點下那個按鈕,然后旋轉一下屏幕篮昧。然后過個5秒榄笙,會提示了泄露了A巍搭盾!在狀態(tài)欄可以看到咳秉,然后點一下,就會跳到上圖的第二個apk去展示鸯隅。

apk.png
通知欄.png

第一次運行可能通知欄提醒了給他個寫存儲的權限澜建,那就給嘛。

權限.png

例子程序是下面這樣的蝌以,有心的人可以看下他是怎么泄露的炕舵,反正我不知道,我就是一把梳跟畅,就是干

public class MainActivity extends Activity {

  @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    View button = findViewById(R.id.async_task);
    button.setOnClickListener(new View.OnClickListener() {
      @Override public void onClick(View v) {
        startAsyncTask();
      }
    });
  }

  void startAsyncTask() {
    new AsyncTask<Void, Void, Void>() {
      @Override protected Void doInBackground(Void... params) {
        // Do some slow work in background
        SystemClock.sleep(20000);
        return null;
      }
    }.execute();
  }
}

看樣子是有個匿名內部類AsyncTask造成的咽筋,匿名內部類持有外部類的引用,外部類是MainActivity 徊件,MainActivity 調用destory的時候奸攻,AsyncTask還在干活呢,不能釋放虱痕,AsyncTask不能釋放睹耐,MainActivity 你就別想釋放。然后現(xiàn)象就是MainActivity 調用destory后皆疹,MainActivity 對象還在內存死皮賴臉的活著疏橄,官方用語就是MainActivity 對象泄露了占拍。

至于檢測原理略就,搞應用的話,就不用知道了晃酒,調調api就用了表牢,想這么多又不會加人工,是不是贝次?開玩笑崔兴,簡單說一下。我接單造個輪子你就知道了蛔翅,十多行代碼就搞定了敲茄,甚至有時我覺得你根本就不需要這個庫,自己造個輪子就好山析。
按照我的理解堰燎,我要造這個輪子的話,是這樣子造的笋轨,在activity的ondestory方法里面實現(xiàn)

  @Override
  protected void onDestroy() {
    super.onDestroy();
   // 開啟一個后臺線程秆剪,這個線程不要持有activity的應用赊淑,不然泄露又說怪這個線程
   Thread detectThread=new DetectThread("detectThread");
    //用一個弱引用指向這個activity,并且關聯(lián)到弱引用序列仅讽,我的意思是關聯(lián)陶缺。怎么關聯(lián)法?這個是java的基礎洁灵,你去搜下WeakReferenceQueue 饱岸,當WeakReference所指對象沒有強引用時,WeakReference就是被放到這個WeakReferenceQueue 序列
  ReferenceQueue queue=new ReferenceQueue();
   WeakReference<Activity> weakref=new WeakReference(this,queue);
   detectThread.start();//開始檢查
  }

在另一個文件定義DetectThread

class DetectThread extend Thread {
       sleep(5000);//睡個5秒去檢測
       gc();   //回收下垃圾先
      if(queue.contains(weakref)){
         Log.i(tag,"沒有泄露徽千,做的很好")伶贰;
      }else{
        Log.i(tag,"泄露了傻逼!9拚弧黍衙!");
       }
}

基本原理太簡單了荠诬,就是新建一個WeakReference對象指向要關注的Activity琅翻,Activity被回收的時候WeakReference對象會加到ReferenceQueue 隊列中,檢測ReferenceQueue隊列 是否有WeakReference對象就知道有沒有泄露了柑贞,有的話就沒有泄露方椎,沒有的話就他媽泄露了。ReferenceQueue 的這一特性自己百度去钧嘶,這是java基礎棠众,基礎,基礎S芯觥U⒛谩!J槟弧新荤!

至于真實源代碼,下節(jié)我再告訴你Lɑ恪苛骨!其實跟我造的輪子差不多。如果我先寫的話苟呐,說不定我就不開源痒芝,收費使用!GK亍严衬!

加班沒有加班費又沒有加班零食,能不能打賞我?guī)酌X買個燒餅两波?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瞳步,一起剝皮案震驚了整個濱河市闷哆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌单起,老刑警劉巖抱怔,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嘀倒,居然都是意外死亡屈留,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門测蘑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灌危,“玉大人,你說我怎么就攤上這事碳胳∮买” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵挨约,是天一觀的道長味混。 經(jīng)常有香客問我,道長诫惭,這世上最難降的妖魔是什么翁锡? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮夕土,結果婚禮上馆衔,老公的妹妹穿的比我還像新娘。我一直安慰自己怨绣,他們只是感情好角溃,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著梨熙,像睡著了一般开镣。 火紅的嫁衣襯著肌膚如雪刀诬。 梳的紋絲不亂的頭發(fā)上咽扇,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音陕壹,去河邊找鬼质欲。 笑死,一個胖子當著我的面吹牛糠馆,可吹牛的內容都是我干的嘶伟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼又碌,長吁一口氣:“原來是場噩夢啊……” “哼九昧!你這毒婦竟也來了绊袋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铸鹰,失蹤者是張志新(化名)和其女友劉穎癌别,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋笼,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡展姐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剖毯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圾笨。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逊谋,靈堂內的尸體忽然破棺而出擂达,到底是詐尸還是另有隱情,我是刑警寧澤胶滋,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布谍婉,位于F島的核電站,受9級特大地震影響镀钓,放射性物質發(fā)生泄漏穗熬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一丁溅、第九天 我趴在偏房一處隱蔽的房頂上張望唤蔗。 院中可真熱鬧,春花似錦窟赏、人聲如沸妓柜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棍掐。三九已至,卻和暖如春拷况,著一層夾襖步出監(jiān)牢的瞬間作煌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工赚瘦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粟誓,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓起意,卻偏偏與公主長得像鹰服,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,302評論 25 707
  • LeakCanary官方Demo介紹 首先可以去github上面downlaod它的官方開源Demo 用Andro...
    最多想你閱讀 4,796評論 2 18
  • 什么是內存泄露 一些對象有著有限的生命周期悲酷。當這些對象所要做的事情完成了套菜,我們希望他們會被回收掉。但是如果有一系列...
    皇馬船長閱讀 1,133評論 0 3
  • 前言 對于內存泄漏设易,我想大家在開發(fā)中肯定都遇到過笼踩,只不過內存泄漏對我們來說并不是可見的,因為它是在堆中活動亡嫌,而要想...
    EsonJack閱讀 897評論 1 3
  • 你問我 孤獨好不好 我說 孤獨無所謂好與不好 遇到你之前 我品味孤獨 把所有的期待都印在孤獨的感覺里 遇到你之后 ...
    清心閣閱讀 148評論 0 1