內(nèi)存泄漏我們戲稱為霸氣側(cè)漏、 如何分析定位霸氣側(cè)漏呢,這里有一套 “還我漂漂拳”
內(nèi)功心法口訣如下
- why
為什么內(nèi)存泄漏分析?- what
內(nèi)存泄漏是什么?
有哪些工具?- how
分析內(nèi)存泄漏的切入點(diǎn)
工具的使用- ** 一些個(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. 工具使用
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)在觀看的你,如果有異議的地方歡迎討論和指正。
如果能給觀看的你帶來收獲,那就是最好不過了。