日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java內(nèi)存分析利器MAT的使用詳解

本篇內(nèi)容主要講解“Java內(nèi)存分析利器MAT的使用詳解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java內(nèi)存分析利器MAT的使用詳解”吧!

創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、汨羅網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為汨羅等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

dump文件包含的內(nèi)容:

1,全部的對象:類,域,原生值和引用;

2,全部的類:classloader,類名,超類,靜態(tài)域;

3,GC root:被JVM定義的可觸達(dá)的對象;

4,線程棧和本地變量:線程的call stack,本地對象每幀的信息。

dump文件不包含內(nèi)存的分配信息,因此無法查詢誰創(chuàng)建了哪個對象這樣的信息。

Shallow heap是一個對象占用的內(nèi)存空間,一個對象需要32或者64bits。

Retained set of X是X在被jvm gc回收后被remove的一組object。

Retained heap of X是在retained set of X中的所有對象的shallow heap size的和。換句話說就是保持X活著需要的內(nèi)存空間。

通俗的講,shallow heap是一個對象在內(nèi)存中的實(shí)際空間,而retained heap是一個對象被gc回收后內(nèi)存釋放出來的空間。

Java內(nèi)存分析利器MAT的使用詳解

這張圖可以看懂什么是leading set什么是retained set。

Dominator tree:定義一個對象x dominate  對象y,當(dāng)每一條從root開始到y(tǒng)的路徑都經(jīng)過x。說白了就是只要有y對象的存活,那么一定會有一個x對象。Dominator  tree就是將對象引用圖轉(zhuǎn)換成的樹形結(jié)構(gòu)。幫助發(fā)現(xiàn)在對象間保持alive的依賴,同時也能識別出retained內(nèi)存的***的chunk。  Immediate dominator x of y是離y最近的dominator。

Dominator tree有幾個屬性:

1,對象x的子樹包含的對象(x dominate的對象集),代表了x的retained set;

2,如果x是y的immediate dominator,那么x的immediate dominator同樣dominate y,以此類推;

3,dominate tree中的邊不代表對象引用圖里對應(yīng)的邊,并非嚴(yán)格的直接的對象引用。

Java內(nèi)存分析利器MAT的使用詳解

這張圖反應(yīng)了一個對象引用圖轉(zhuǎn)換成dominator tree的示例。

Gc root:一個gc根就是一個對象,這個對象從堆外可以訪問讀取。以下一些方法可以使一個對象成為gc根。

1,System class:被Bootstrap或者system類加載器加載的類,比如rt.jar里的java.util.*;

2,JNI local:native代碼里的local變量,比如用戶定義的JNI代碼和JVM的內(nèi)部代碼;

3,JNI global:native代碼里的global變量;

4,Thread block:當(dāng)前活躍的線程block中引用的對象;

5,Thread:已經(jīng)啟動并且沒有stop的線程;

6,busy monitor:被調(diào)用了wait()或者notify()或者被synchronized同步的對象,如果是synchronized方法,那么靜態(tài)方法指的類,非靜態(tài)方法指的是對象;

7,java local:local變量,比如方法的入?yún)⒑头椒▋?nèi)創(chuàng)建的變量;

8,native stack:native代碼里的出入?yún)?shù),比如file/net/IO方法以及反射的參數(shù);

9,finalizable:在一個隊(duì)列里等待它的finalizer 運(yùn)行的對象;

10,unfinalized:一個有finalize方法的對象,還沒有被finalize,同時也沒有進(jìn)入finalizer隊(duì)列等待finalize;

11,unreachable:不會被觸碰到的對象,在MAT里被標(biāo)記為root用來retain object,否則是不會在分析中出現(xiàn)的;

12,java stack frame:java棧幀包含了本地變量,當(dāng)dump被解析時且在preferences里設(shè)置過把棧幀當(dāng)做對象,這時才會產(chǎn)生;

13,unknown:位置的root類型。

接下來是一些獲取dump的方法:

1,在oom時dump:JVM參數(shù):-XX:+HeapDumpOnOutOfMemoryError

2,交互式環(huán)境下dump:

1)JVM參數(shù):-XX:+HeapDumpOnCtrlBreak

2)用外部tools:jmap -dump:format=b,file=

3)用外部tools:jconsole

4)用外部工具:MAT

5)kill -3

6)jstack -l >

一些排查方法:

1,通過top consumers查找大對象,可以按照class、classloader和package進(jìn)行g(shù)roup by;

2,通過immediate dominator找到責(zé)任對象,對于快速定位一組對象的持有者非常有用,這個操作直接解決了“誰讓這些對象alive”的問題,而不是“誰有這些對象的引用”的問題,更直接高效;

3,運(yùn)行classloader分析,這個重要性體現(xiàn)在亮點(diǎn):***,應(yīng)用使用不同的classloader加載類,第二,不同  classloader加載的類存儲在不同的***代,這理論上也是可以被回收的。當(dāng)有一個類被不同的classloader加載時,這時要根據(jù)各自  loader下的instance數(shù)量判斷哪個loader更重要,從而要把另一個回收掉;

4,分析線程,本身heap dump里包含了thread信息,可以通過MAT來查看threads  的overview和detail,detail中有線程的堆內(nèi)存信息,也有線程棧,同時還包含了操作系統(tǒng)本地棧。假設(shè)不做heap  dump,我們檢查到系統(tǒng)有問題,如何通過線程的角度來排查呢?首先top -H -p  以線程的模式查看java應(yīng)用的運(yùn)行情況,找到占用cpu或者內(nèi)存大的線程,記錄線程id,然后printf %x  轉(zhuǎn)為16進(jìn)制,再jstack -l > thread.log把java進(jìn)程的thread  dump出來,從里面找到tid,分析是哪個線程占用了系統(tǒng)資源。

5,分析java容器類,因?yàn)閖ava的容器類是最常用來存儲對象的,所以理論上發(fā)生內(nèi)存泄露的風(fēng)險也***。可以從幾個角度來  看:1)array填充率查詢(填充率fill  ratio是數(shù)組中非空元素的比例),打印非原生類型數(shù)組的填充率頻率分布,從而排查系統(tǒng)中array的利用率;2)數(shù)組按照size分組查詢,打印一個  按size分組的直方圖;3)collection的填充率查詢,ArrayList/HashMap/Hashtable/Properties  /Vector/WeakHashMap/ConcurrentHashMap$Segment;4)collection按照size分組直方圖;5)   查看一個list里的所有對象;6)查看hashmap里的所有對象;7)查看hashset里的對象;8)檢查map的碰撞率;9)檢查所有只有一個常  量的array。

6,分析Finalizer,1)查詢finalizer正在處理的對象;2)查詢finalizer準(zhǔn)備處理的對象;3)直接查看finalizer線程;4)查看finalizer線程的thread local對象。

到此,相信大家對“Java內(nèi)存分析利器MAT的使用詳解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


新聞標(biāo)題:Java內(nèi)存分析利器MAT的使用詳解
文章出自:http://www.dlmjj.cn/article/gpgeih.html