Android內(nèi)存泄漏分析那點(diǎn)破事

內(nèi)存泄漏我們戲稱為霸氣側(cè)漏、 如何分析定位霸氣側(cè)漏呢,這里有一套 “還我漂漂拳”
內(nèi)功心法口訣如下

  1. why
    為什么內(nèi)存泄漏分析?
  2. what
    內(nèi)存泄漏是什么?
    有哪些工具?
  3. how
    分析內(nèi)存泄漏的切入點(diǎn)
    工具的使用
  4. ** 一些個(gè)人觀點(diǎn)**
    非靜態(tài)內(nèi)部類不是內(nèi)存泄漏

有不對的或者不到位的地方,請指出來。


1. Why

不忘初心、方得始終。

1.1. 為什么內(nèi)存泄漏分析?

1.1.1. 開發(fā)者?測試?

開發(fā)者親自做測試,這不是搶測試工程師的飯碗么?這本來就是測試工程師干的事情,而且花這么多時(shí)間干測試的工作還不如多寫幾行代碼,實(shí)現(xiàn)幾個(gè)功能來的實(shí)在。 有人肯定會(huì)嗤之以鼻的說,包括以前的我年少無知也都有過這種想法... 那么開發(fā)者做內(nèi)存泄漏分析測試有什么好處呢?
1、減少被測試懟的機(jī)會(huì);
2、在發(fā)現(xiàn)以及解決bug的同時(shí)能幫助我們思考bug產(chǎn)生的原因,再次寫代碼時(shí)能提高我們代碼的健壯性減少bug產(chǎn)生率。
3、對代碼更加負(fù)責(zé)。

2. what

分析她、了解她

2.1. 內(nèi)存泄漏是什么?

是什么?


有個(gè)巡撫(省長)犯了大罪,皇帝要將他斬首,沒想到這個(gè)大臣投靠了敵方國家,出逃走了。皇帝沒有殺死巡撫,而這個(gè)巡撫管理的省城也還是被巡撫霸占著,皇帝干不掉巡撫,也沒有辦法回收省城。
以上的 例子中: 巡撫(產(chǎn)生內(nèi)存泄漏的對象) ,敵方國家(持久對象/) 巡撫霸占的省城(對象占用的內(nèi)存),皇帝(GC回收機(jī)制)
小結(jié) 1:
業(yè)務(wù)上需要被銷毀的對象,卻被持久對象非法持有了引用,導(dǎo)致內(nèi)存不再被控制,這就是我們定義的內(nèi)存泄漏。

2.2. 產(chǎn)生的一些總結(jié)

為什么產(chǎn)生? 嘿嘿嘿, 當(dāng)然是先百度呀,我們要站在前人的經(jīng)驗(yàn)上更上一層樓。



以下是我歸納的一些常見的內(nèi)存泄漏場景:

小結(jié)2:

  • 非靜態(tài)內(nèi)部類 和 匿名內(nèi)部類 持有外部對象的引用
  • 單例模式下 context 的引用
  • 資源未及時(shí)關(guān)閉(BroadCassReceviver、Cursor、Bitmap、IO流、自定義屬性未回收、等等)
  • 監(jiān)聽類為及時(shí)關(guān)閉
  • 無線循環(huán)動(dòng)畫(輪播等)

2.3. 有哪些工具幫助我們定位內(nèi)存泄漏

  • Android Monitors
  • MAT內(nèi)存分析工具
  • Allaction Tracing 追蹤內(nèi)存分配
  • Leak Lancary 內(nèi)存泄漏檢測
  • Lint 檢查

3. how

用行動(dòng)征服她

3.1. 分析內(nèi)存泄漏的切入點(diǎn)

波動(dòng)法
查看內(nèi)存實(shí)時(shí)占用情況,根據(jù)內(nèi)存波動(dòng)大概定位內(nèi)存泄漏分析的地方
比較法
比較動(dòng)作發(fā)生前節(jié)點(diǎn)、以及動(dòng)作發(fā)生后回到動(dòng)作發(fā)生前節(jié)點(diǎn) 內(nèi)存的占用情況。
側(cè)重大內(nèi)存法
這個(gè)就不用怎么解釋了,重點(diǎn)關(guān)注大內(nèi)存,因?yàn)榇髢?nèi)存的內(nèi)存泄漏更容易導(dǎo)致程序OOM
無腦法
就完全看工具的檢測分析,比如lint;

3.2. 工具使用

Android內(nèi)存分析工具使用

4. 一些個(gè)人觀點(diǎn)

關(guān)于非靜態(tài)內(nèi)部類內(nèi)存泄漏
個(gè)人感覺并非嚴(yán)格意義上的內(nèi)存泄漏, 因?yàn)樗膬?nèi)存泄漏是暫時(shí)的, 比如內(nèi)部handler 大家都知道handler的運(yùn)行機(jī)制是:MessageQueue -> message -> 操作 -> UI; 當(dāng)我們再“操作”這步的時(shí)候,我們退出界面,實(shí)際上 UI還是被我們handler所引用著,但當(dāng)我們的操作完成以后,UI還是可以被系統(tǒng)回收掉的。
大家可以去實(shí)驗(yàn)一下。


希望我的文章不會(huì)誤導(dǎo)在觀看的你,如果有異議的地方歡迎討論和指正。
如果能給觀看的你帶來收獲,那就是最好不過了。

人生得意須盡歡, 桃花塢里桃花庵
點(diǎn)個(gè)關(guān)注唄,對,不信你點(diǎn)試試?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 作者:小強(qiáng) 貝聊移動(dòng)開發(fā)部 Android工程師 1.Java內(nèi)存分配策略 Java 程序運(yùn)行時(shí)的內(nèi)存分配策略有三...
    貝聊科技閱讀 2,276評論 1 7
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,825評論 25 709
  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏...
    apkcore閱讀 1,303評論 2 7
  • 樓道里的偶遇 一縷清香 冰清玉潔的左臂 我也就輕輕的一瞥 你上你的樓 我下我的樓
    昭平湖閱讀 116評論 0 0
  • 晚上少熬夜,躺在床上不要來回刷手機(jī),越刷越孤獨(dú),胃不好就少吃辣椒、冷飲、過熱的食品,容易發(fā)胖的體質(zhì)管不住嘴就多運(yùn)動(dòng)...

友情鏈接更多精彩內(nèi)容