<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Change Dir

    先知cd——熱愛生活是一切藝術(shù)的開始

    統(tǒng)計

    留言簿(18)

    積分與排名

    “牛”們的博客

    各個公司技術(shù)

    我的鏈接

    淘寶技術(shù)

    閱讀排行榜

    評論排行榜

    使用MAT對java內(nèi)存分析

    這是一篇閱讀MAT helper的筆記。

    Heap dump
    java進(jìn)程在特定時間的一個內(nèi)存快照。通常在觸發(fā)heap dump之前會進(jìn)行一次full gc,這樣dump出來的內(nèi)容就包含的是被gc后的對象。

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

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

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

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

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

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

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

    Retained set of XX在被jvm gc回收后被remove的一組object

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

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

     


     

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

     

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

    Dominator tree有幾個屬性:

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

    2,如果xyimmediate dominator,那么ximmediate dominator同樣dominate y,以此類推;

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

     


     

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

     

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

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

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

    3JNI globalnative代碼里的global變量;

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

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

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

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

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

    9finalizable:在一個隊列里等待它的finalizer 運行的對象;

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

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

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

    13unknown:位置的root類型。

     

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

    1,在oomdumpJVM參數(shù):-XX:+HeapDumpOnOutOfMemoryError

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

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

    2)用外部toolsjmap -dump:format=b,file=<filename.hprof> <pid>

    3)用外部toolsjconsole

    4)用外部工具:MAT

    5kill -3 <pid>

    6jstack -l <pid> > <dumpfile>

     

    一些排查方法:

    1,通過top consumers查找大對象,可以按照classclassloaderpackage進(jìn)行group by

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

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

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

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

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

    posted on 2015-08-17 19:08 changedi 閱讀(7469) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 一级毛片一级毛片免费毛片| 亚洲另类无码一区二区三区| 巨胸狂喷奶水视频www网站免费| 亚洲综合久久一本伊伊区| 久久青草免费91线频观看站街| 久久亚洲国产精品一区二区| 久操视频在线免费观看| 中文字幕亚洲第一在线| 青青青国产在线观看免费网站| 天堂亚洲国产中文在线| 日韩精品视频免费网址| 免费精品视频在线| 亚洲中文字幕无码永久在线| 在线看片免费人成视频播 | 亚洲国产中文v高清在线观看| 免费一级毛suv好看的国产网站 | 久久狠狠高潮亚洲精品| 精品无码免费专区毛片| 亚洲 日韩经典 中文字幕 | 亚洲va在线va天堂成人| 女人毛片a级大学毛片免费| 国产精品无码亚洲精品2021| AV在线播放日韩亚洲欧| 国产精品99精品久久免费| 亚洲av无码不卡久久| 亚洲M码 欧洲S码SSS222| 国产精品白浆在线观看免费| 亚洲人成电影网站色www| 亚洲狠狠爱综合影院婷婷| 免费观看男人吊女人视频| 国产精品亚洲专区在线观看| 亚洲高清成人一区二区三区| 99在线观看免费视频| 亚洲国产精品久久久天堂| 免费在线视频你懂的| 国产精品亚洲小说专区| 亚洲AV第一页国产精品| 青青青国产免费一夜七次郎 | 91大神在线免费观看| 亚洲av无码专区国产不乱码| 日本亚洲欧洲免费天堂午夜看片女人员 |