Java的內(nèi)存泄露
- Java中的內(nèi)存泄露主要特征:可達(dá),無用
- 無用指的是創(chuàng)建了但是不再使用之后沒有釋放
- 能重用但是卻創(chuàng)建了新的對(duì)象進(jìn)行處理
MAT使用技巧
使用Android Studio Dump內(nèi)存文件
Android Studio的最新版本可以直接獲取hprof文件:
然后選擇文件,點(diǎn)擊右鍵轉(zhuǎn)換成標(biāo)準(zhǔn)的hprof文件对妄,就可以在MAT中打開了。
在使用使用Eclipse或者AndroidStudio抓內(nèi)存之前裹纳,一定要手動(dòng)點(diǎn)擊 Initiate GC按鈕手動(dòng)觸發(fā)GC妆距,這樣抓到的內(nèi)存使用情況就是不包括Unreachable對(duì)象的懦趋。
image.png
Unreachable對(duì)象
Unreachable指的是可以被垃圾回收器回收的對(duì)象闯团,但是由于沒有GC發(fā)生辛臊,所以沒有釋放,這時(shí)抓的內(nèi)存使用中的Unreachable就是這些對(duì)象房交。
點(diǎn)擊Calculate Retained Size之后彻舰,會(huì)出現(xiàn)Retained Size這一列
可以看到Unreachable Object的對(duì)象其Retained Heap值都為0.這也是正常的。
Histogram
MAT中Histogram的主要作用是查看一個(gè)instance的數(shù)量候味,一般用來查看自己創(chuàng)建的類的實(shí)例的個(gè)數(shù)刃唤。
- 可以很容易的找出占用內(nèi)存最多的幾個(gè)對(duì)象,根據(jù)Percentage(百分比)來排序白群。
- 可以分不同維度來查看對(duì)象的Dominator Tree視圖透揣,Group by class、Group by class loader川抡、Group by package
和Histogram類似,時(shí)間久了须尚,通過多次對(duì)比也可以把溢出對(duì)象找出來崖堤。 - Dominator Tree和Histogram的區(qū)別是站的角度不一樣,Histogram是站在類的角度上去看耐床,Dominator Tree是站的對(duì)象實(shí)例的角度上看密幔,Dominator Tree可以更方便的看出其引用關(guān)系。
通過查看Object的個(gè)數(shù)撩轰,結(jié)合代碼就可以找出存在內(nèi)存泄露的類(即可達(dá)但是無用的對(duì)象胯甩,或者是可以重用但是重新創(chuàng)建的對(duì)象)
Histogram中還可以對(duì)對(duì)象進(jìn)行Group昧廷,更方便查看自己Package中的對(duì)象信息。
Thread信息
MAT中可以查看當(dāng)前的Thread信息:
從圖中可以得到的信息:
- 可以看到可能有內(nèi)存問題的Thread:
- 可以看到數(shù)量可能有問題的Thread
幫助信息
MAT中的各個(gè)視圖中偎箫,在每一個(gè)Item中點(diǎn)擊右鍵會(huì)出現(xiàn)很多選項(xiàng)木柬,很多時(shí)候我們需要依賴這些選項(xiàng)來進(jìn)行分析:
這些選項(xiàng)的具體含義則可以通過右鍵中的Search Queries這個(gè)選項(xiàng)(上圖中的倒數(shù)第四個(gè)選項(xiàng))進(jìn)行搜索和查看,非常的有用淹办。
可以看到眉枕,所有的命令其實(shí)就是配置不同的SQL查詢語句。
比如我們最常用的:
- List objects -> with incoming references:查看這個(gè)對(duì)象持有的外部對(duì)象引用
- List objects -> with outcoming references:查看這個(gè)對(duì)象被哪些外部對(duì)象引用
- Path To GC Roots -> exclude all phantim/weak/soft etc. references:查看這個(gè)對(duì)象的GC Root怜森,不包含虛速挑、弱引用、軟引用副硅,剩下的就是強(qiáng)引用姥宝。從GC上說,除了強(qiáng)引用外恐疲,其他的引用在JVM需要的情況下是都可以 被GC掉的腊满,如果一個(gè)對(duì)象始終無法被GC,就是因?yàn)閺?qiáng)引用的存在流纹,從而導(dǎo)致在GC的過程中一直得不到回收糜烹,因此就內(nèi)存溢出了。
- Path To GC Roots -> exclude weak/soft references:查看這個(gè)對(duì)象的GC Root漱凝,不含弱引用和軟引用所有的引用.
- **Merge Shortest path to GC root **:找到從GC根節(jié)點(diǎn)到一個(gè)對(duì)象或一組對(duì)象的共同路徑
Debug Bitmap
如果經(jīng)常使用MAT分析內(nèi)存疮蹦,就會(huì)發(fā)現(xiàn)Bitmap所占用的內(nèi)存是非常大的,這個(gè)和其實(shí)際顯示面積是有關(guān)系的茸炒。在2K屏幕上愕乎,一張Bitmap能達(dá)到20MB的大小。
所以要是MAT提供了一種方法壁公,可以將存儲(chǔ)Bitmap的byte數(shù)組導(dǎo)出來感论,使用第三方工具打開。這個(gè)大大提高了我們分析內(nèi)存泄露的效率紊册。
關(guān)于這個(gè)方法的操作流程比肄,可以參考這篇文章還原MAT中的Bitmap圖像.
Debug ArrayList
ArrayList是使用非常常用的一個(gè)數(shù)據(jù)結(jié)構(gòu),在MAT中囊陡,如果想知道ArrayList中有哪些數(shù)據(jù)芳绩,需要右鍵-> List Objects -> With outgoing references,然后可以看到下面的圖:
從上圖可以看到,這個(gè)ArrayList的內(nèi)容在一個(gè)array數(shù)組中撞反,即暴漏了ArrayList的內(nèi)部結(jié)構(gòu)妥色,查看的時(shí)候有點(diǎn)不方便,所以MAT提供了另外一種查看ArrayList內(nèi)數(shù)據(jù)的方式:
其結(jié)果非常直觀:
Big Drops In Dominator Tree
Big Drops In Dominator Tree選項(xiàng)在右鍵->
Displays memory accumulation points in the dominator tree. Displayed are objects with a big difference between the retained size of the parent and the children and the first "interesting" dominator of the accumulation point. These are places where the memory of many small objects is accumulated under one object.
作者:Gracker
鏈接:http://www.reibang.com/p/c8e0f8748ac0
來源:簡書
簡書著作權(quán)歸作者所有遏片,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處嘹害。