char类型是多少 mat_这轮面试,居然只有20%的人了解 MAT 神器
MAT是eclipse中的一個(gè)插件,不過(guò)也提供了獨(dú)立的版本,在IDEA風(fēng)靡的今天,建議直接使用獨(dú)立版本,官網(wǎng)下載地址
http://www.eclipse.org/mat/downloads.php
根據(jù)操作系統(tǒng)版本下載最新的MAT
MAT配置
找到MemoryAnalyzer.ini文件,該文件里面有個(gè)Xmx參數(shù),該參數(shù)表示最大內(nèi)存占用量,默認(rèn)為1024m,根據(jù)堆轉(zhuǎn)儲(chǔ)文件大小修改該參數(shù)即可。
獲取堆轉(zhuǎn)儲(chǔ)文件
1、如果想主動(dòng)獲取,可以使用jamp命令,對(duì)于部署到服務(wù)器上的程序可以采用這種方式,獲取堆轉(zhuǎn)儲(chǔ)文件后scp到本地,然后本地分析。jmap?-dump:format=b,file=?
2、如果想在發(fā)生內(nèi)存溢出的時(shí)候自動(dòng)dump,需要添加下面參數(shù)-XX:+HeapDumpOnOutOfMemoryError
MAT使用
打開(kāi)MAT之后,加載dump文件,顯示下面的界面。
一般用到比較多的2個(gè)功能 1、Histogram 2、Leak Suspects
Histogram
這個(gè)功能主要是查看類和對(duì)象關(guān)系,對(duì)象和對(duì)象之間的關(guān)系,用來(lái)定位哪些對(duì)象在FGC之后還活著,哪些對(duì)象占大部分內(nèi)存。
1、點(diǎn)開(kāi)Histogram,可列出每一個(gè)類的實(shí)例數(shù),支持正則表達(dá)式查找,也可以計(jì)算出該類所有對(duì)象的retained size。
Shallow Heap就是對(duì)象本身占用內(nèi)存的大小,不包含其引用的對(duì)象內(nèi)存,實(shí)際分析中作用不大。常規(guī)對(duì)象(非數(shù)組)的ShallowSize由其成員變量的數(shù)量和類型決定。數(shù)組的shallow size有數(shù)組元素的類型(對(duì)象類型、基本類型)和數(shù)組長(zhǎng)度決定。對(duì)象成員都是些引用,真正的內(nèi)存都在堆上,看起來(lái)是一堆原生的byte[], char[], int[],對(duì)象本身的內(nèi)存都很小。
Retained Heap值的計(jì)算方式是將Retained Set(當(dāng)該對(duì)象被回收時(shí)那些將被GC回收的對(duì)象集合)中的所有對(duì)象大小疊加。或者說(shuō),因?yàn)閄被釋放,導(dǎo)致其它所有被釋放對(duì)象(包括被遞歸釋放的)所占的heap大小。
Retained Heap例子: 一個(gè)ArrayList對(duì)象持有100個(gè)對(duì)象,每一個(gè)占用16 bytes,如果這個(gè)list對(duì)象被回收,那么其中100個(gè)對(duì)象也可以被回收,可以回收16*100 + X的內(nèi)存,X代表ArrayList的shallow大小。
所以,RetainedHeap可以更精確的反映一個(gè)對(duì)象實(shí)際占用的大小。
2、選擇一個(gè)Class,右鍵選擇List objects > with incoming references
在新頁(yè)面會(huì)顯示通過(guò)這個(gè)class創(chuàng)建的對(duì)象信息
3、選擇一個(gè)對(duì)象,右鍵選擇Path to GC Roots > **,通常在排查內(nèi)存泄漏的時(shí)候,我們會(huì)選擇exclude all phantom/weak/soft etc.references, 意思是查看排除虛引用/弱引用/軟引用等的引用鏈,因?yàn)楸惶撘?弱引用/軟引用的對(duì)象可以直接被GC給回收,我們要看的就是某個(gè)對(duì)象否還存在Strong 引用鏈(在導(dǎo)出HeapDump之前要手動(dòng)出發(fā)GC來(lái)保證),如果有,則說(shuō)明存在內(nèi)存泄漏,然后再去排查具體引用。
這時(shí)會(huì)拿到GC Roots到該對(duì)象的路徑,通過(guò)對(duì)象之間的引用,可以清楚的看出這個(gè)對(duì)象沒(méi)有被回收的原因,然后再去定位問(wèn)題。
假如說(shuō)上面對(duì)象此時(shí)本來(lái)應(yīng)該是被GC掉的,簡(jiǎn)單的辦法就是將其中的某處置為null或者remove掉,使其到GC Root無(wú)路徑可達(dá),處于不可觸及狀態(tài),垃圾回收器就可以回收了。
Leak Suspects
Leak Suspects 界面提示可能存在內(nèi)存的泄露。
然后接著,是問(wèn)題一的描述,列出了一些比較大的實(shí)例。
點(diǎn)擊Details可以看到細(xì)節(jié)信息
點(diǎn)開(kāi)Details進(jìn)入詳情頁(yè)面,在詳情頁(yè)面Shortest Paths To the Accumulation Point表示GC root到內(nèi)存消耗聚集點(diǎn)的最短路徑,如果某個(gè)內(nèi)存消耗聚集點(diǎn)有路徑到達(dá)GC root,則該內(nèi)存消耗聚集點(diǎn)不會(huì)被當(dāng)做垃圾被回收。
內(nèi)存快照對(duì)比
為了有效的找出內(nèi)存泄露的對(duì)象,一般會(huì)獲取兩個(gè)堆轉(zhuǎn)儲(chǔ)文件(先dump一個(gè),隔段時(shí)間再dump一個(gè)),并同時(shí)打開(kāi)兩個(gè)dump文件。
打開(kāi)其中一個(gè)Histogram,然后點(diǎn)擊下面按鈕。
選擇另外一個(gè)需要對(duì)比的dump文件
通過(guò)對(duì)比結(jié)果可以方便的看出對(duì)象的變化情況,并快速定位問(wèn)題。
總結(jié)
以上是生活随笔為你收集整理的char类型是多少 mat_这轮面试,居然只有20%的人了解 MAT 神器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 应该如何清理提速如何取消清理加速
- 下一篇: 好看不贵!《海贼王》推四大金钗比基尼泳装