Android LeakCanary 檢測內(nèi)存泄露

內(nèi)存泄漏:

指程序在申請內(nèi)存后 ,無法釋放已經(jīng)申請的內(nèi)存空間熊响,一次內(nèi)存泄漏可以忽略,但內(nèi)存泄漏堆積后果很嚴(yán)重诗赌,無論多少內(nèi)存汗茄,都會被占光

內(nèi)存泄露危害:

1.內(nèi)存泄露最終會導(dǎo)致內(nèi)存溢出(OOM)

2.導(dǎo)致程序卡頓,應(yīng)用程序莫名退出

內(nèi)存泄露檢測工具

  • Memory Monitor(不能精準(zhǔn)的定位問題)
  • MAT工具 (操作復(fù)雜铭若,學(xué)習(xí)成本高)
  • 還有許多就不一一列舉了

Android中常見的內(nèi)存泄露(歡迎指證與添加)

大圖片也能造成OOM

hangdler造成的內(nèi)存泄露解決辦法

當(dāng)Activity退出時(shí)消息隊(duì)列中還有未處理的消息或者正在處理的消息
而消息隊(duì)列中的Messager持有handler實(shí)例的引用洪碳, handler又持有activity的引用,所以導(dǎo)致Activity的內(nèi)存資源無法及時(shí)回收叼屠,引發(fā)內(nèi)存泄露

解決辦法:
1.使用弱引用
2.使用靜態(tài)handler內(nèi)部類
3.在onDestory()方法中調(diào)用removeCallbacksAndMessagers(null);

單例造成的內(nèi)存泄露解決辦法

原因:單例的靜態(tài)特性 使得單例的生命周期和應(yīng)用的生命周期一樣長瞳腌,這就說明如果一個(gè)對象已經(jīng)不需要使用了,而單例對象還持有該對象的引用镜雨,那么這個(gè)對象不能正成┦蹋回收,就會導(dǎo)致內(nèi)存泄露

解決辦法:如果此時(shí)傳入的是 Activity 的 Context,當(dāng)這個(gè) Context 所對應(yīng)的 Activity 退出時(shí)挑宠,由于該 Context 的引用被單例對象所持有菲盾,其生命周期等于整個(gè)應(yīng)用程序的生命周期,所以當(dāng)前 Activity 退出時(shí)它的內(nèi)存并不會被回收各淀,這就造成泄漏了
所以如果此時(shí)傳入的是 Application 的 Context懒鉴,因?yàn)?Application 的生命周期就是整個(gè)應(yīng)用的生命周期,所以這沒有任何問題碎浇。

非靜態(tài)內(nèi)部類創(chuàng)建實(shí)例造成的內(nèi)存泄露

將該內(nèi)部類設(shè)為靜態(tài)內(nèi)部類或?qū)⒃搩?nèi)部類抽取出來封裝成一個(gè)單例临谱,如果需要使用Context,請使用ApplicationContext

線程造成的內(nèi)存泄露

異步任務(wù)和Runnable都是一個(gè)匿名內(nèi)部類奴璃,因此它們對當(dāng)前Activity都有一個(gè)隱式引用悉默。如果Activity在銷毀之前,任務(wù)還未完成苟穆,
那么將導(dǎo)致Activity的內(nèi)存資源無法回收麦牺,造成內(nèi)存泄漏

解決辦法
正確的做法還是使用靜態(tài)內(nèi)部類的方式

資源沒有關(guān)閉造成的內(nèi)存泄露

如數(shù)據(jù)庫 流

LeakCanary介紹

這個(gè)才是今天的正題

LeakCanary使用示例

??參考LeakCanary官方示例 https://github.com/square/leakcanary
首先我們需要在應(yīng)用的 build.gradle 中,添加依賴:
<pre><code>
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2
</code></pre>

LeakCanary依賴添加后鞭缭,我們添加一個(gè)Application類

1.創(chuàng)建個(gè)MyApplication類
<pre><code>
public class MyApplication extends Application {
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
}
</pre></code>

2.在AndroidManifest.xml文件中去配置這個(gè)application

 android:name=".MyApplication"

3.LeakCanary的配置就已經(jīng)完成了剖膳,

然后運(yùn)行應(yīng)用程序除了會安裝自己的App外還會安裝leaks這個(gè)東西

https://github.com/square/leakcanary/raw/master/assets/icon_512.png
https://github.com/square/leakcanary/raw/master/assets/icon_512.png

4.完(萬)事具備,只欠東方 下面我就舉個(gè)內(nèi)存泄露的例子
<pre><code>
private void initView() {
Button tv = (Button) findViewById(R.id.tv);
tv.setText("dsafsdfadsfdsafsa");
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AsyncTaskTest();
finish();
}
}
);
}
public void AsyncTaskTest() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(20000000);
return null;
}
}.execute();
}
</pre></code>

5.點(diǎn)擊按鈕 稍等片刻(可能時(shí)間稍微有點(diǎn)長)岭辣,就會出現(xiàn)下面這個(gè)信息了

這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吱晒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沦童,更是在濱河造成了極大的恐慌仑濒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偷遗,死亡現(xiàn)場離奇詭異墩瞳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)氏豌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門喉酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泵喘,你說我怎么就攤上這事泪电。” “怎么了纪铺?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵相速,是天一觀的道長。 經(jīng)常有香客問我鲜锚,道長突诬,這世上最難降的妖魔是什么苫拍? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮旺隙,結(jié)果婚禮上怯疤,老公的妹妹穿的比我還像新娘。我一直安慰自己催束,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布伏社。 她就那樣靜靜地躺著抠刺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摘昌。 梳的紋絲不亂的頭發(fā)上速妖,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音聪黎,去河邊找鬼罕容。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稿饰,可吹牛的內(nèi)容都是我干的锦秒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喉镰,長吁一口氣:“原來是場噩夢啊……” “哼旅择!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣姆,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤生真,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捺宗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柱蟀,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年蚜厉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了长已。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼牛,死狀恐怖痰哨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匾嘱,我是刑警寧澤斤斧,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站霎烙,受9級特大地震影響撬讽,放射性物質(zhì)發(fā)生泄漏蕊连。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一游昼、第九天 我趴在偏房一處隱蔽的房頂上張望甘苍。 院中可真熱鬧,春花似錦烘豌、人聲如沸载庭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚聚。三九已至,卻和暖如春标锄,著一層夾襖步出監(jiān)牢的瞬間顽铸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工料皇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谓松,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓践剂,卻偏偏與公主長得像鬼譬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逊脯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題拧簸。內(nèi)存泄漏大家都不陌生了,簡單粗俗的講男窟,...
    宇宙只有巴掌大閱讀 2,362評論 0 12
  • 前言 對于內(nèi)存泄漏盆赤,我想大家在開發(fā)中肯定都遇到過,只不過內(nèi)存泄漏對我們來說并不是可見的歉眷,因?yàn)樗窃诙阎谢顒游?..
    EsonJack閱讀 889評論 1 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 我們?nèi)叶紣鄢匀鈯A饃 可是對于外面的肉肉有點(diǎn)不放心 還是自己親自動手吧 親自和面 烙餅 親自煮肉 做成了家人都愛吃...
    蘇小柚閱讀 306評論 0 1
  • 在現(xiàn)實(shí)的生活當(dāng)中,你可能對當(dāng)下的事情汗捡,很難做到百分之百的判斷淑际。但是對已經(jīng)發(fā)生的事情,你的總結(jié)和完善扇住,那才是重要的春缕。
    澤陽9閱讀 143評論 0 1