內(nèi)存抖動(dòng)
引起的原因:短時(shí)間內(nèi)有大量對象創(chuàng)建與銷毀敛助,它伴隨著頻繁的GC权她。
內(nèi)存抖動(dòng)會(huì)引起頻繁的gc,gc是會(huì)STW的疑故,會(huì)暫停用戶線程。
Android Studio 內(nèi)置了性能監(jiān)測工具M(jìn)emory Monitor
A:手動(dòng)觸發(fā)GC操作
B:獲取當(dāng)前的堆棧信息弯菊,生成.hprof文件
C:內(nèi)存分配追蹤工具纵势,生成.alloc文件
D:已使用內(nèi)存
E:剩余可用內(nèi)存
通過與應(yīng)用交互并在Memory Monitor中觀察它是如何影響內(nèi)存的使用,圖表可以為你展示一些潛在的問題:
1.頻繁的垃圾收集活動(dòng)使應(yīng)用運(yùn)行緩慢管钳。
2.應(yīng)用耗盡內(nèi)存導(dǎo)致app崩潰.
3.潛在的內(nèi)存泄漏
正常情況下钦铁,上圖中的D區(qū)域會(huì)隨著時(shí)間的走勢慢慢上升(就算你與APP沒有任何交互),直到E區(qū)域被用完才漆,則會(huì)觸發(fā)GC操作牛曹,釋放內(nèi)存,周而復(fù)始醇滥。如果你發(fā)現(xiàn)你的應(yīng)用是靜態(tài)的黎比,但是E區(qū)域的內(nèi)存很快就被用完了,即頻繁的觸發(fā)GC操作鸳玩,這時(shí)你就應(yīng)該引起重視阅虫,說不定你的代碼中就存在著引起內(nèi)存泄漏的隱患。
在Memory一欄中不跟,可以觀察不同時(shí)間App內(nèi)存的動(dòng)態(tài)使用情況颓帝,點(diǎn)擊可以手動(dòng)觸發(fā)GC(點(diǎn)擊上圖A處),然后點(diǎn)擊上圖B處可以進(jìn)入HPROF Viewer界面窝革,查看Java的Heap购城,如下圖
最后補(bǔ)充一個(gè)我遇到的例子
以上是我的例子,不斷的從MainActivity跳到Main2Activity虐译,很明顯會(huì)因?yàn)镃ontext導(dǎo)致內(nèi)存泄漏瘪板,下面我們用Android Monitor來排查出來
然后進(jìn)入到.hprof結(jié)尾的文件
內(nèi)存泄漏,MAT檢測內(nèi)存泄漏實(shí)戰(zhàn)
dump完成后Android studio會(huì)開啟一個(gè)新的視圖顯示當(dāng)前內(nèi)存中的所有對象
?導(dǎo)出hprof文件漆诽,點(diǎn)擊導(dǎo)出按鈕將Android studio中的hprof文件導(dǎo)出到自己的文件夾篷帅,用于后續(xù)在MAT工具中分析。
導(dǎo)出的hprof文件是無法直接在MAT工具中分析的拴泌,如果直接在MAT中打開這個(gè)文件會(huì)報(bào)錯(cuò),需要進(jìn)行轉(zhuǎn)換惊橱,轉(zhuǎn)換工具是sdk/platform-tools里面的hprof-conv.exe工具蚪腐,執(zhí)行命令進(jìn)行轉(zhuǎn)換:
在MAT中打開轉(zhuǎn)換后的文件,打開后選擇Histogram視圖税朴,輸入SecondActivity進(jìn)行過濾回季,可以看到SecondActivity對象有2個(gè)家制,右鍵選擇SecondActivity對象,選擇merge shortest paths to gc roots -> exclude all phantom/weak/soft etc. references泡一,排除掉虛引用/弱引用/軟引用,只保留強(qiáng)引用,因?yàn)橹挥袕?qiáng)引用才會(huì)導(dǎo)致內(nèi)存泄露茂翔。
分析強(qiáng)引用的引用鏈: