資源描述:
《java內存分析利器mat使用詳解》由會員上傳分享,免費在線閱讀,更多相關內容在教育資源-天天文庫。
1、Java內存分析利器MAT使用詳解這是一篇閱讀MAThelper的筆記。Heapdump是java進程在特定時間的一個內存快照。通常在觸發(fā)heapdump之前會進行一次fullgc,這樣dump出來的內容就包含的是被gc后的對象。dump文件包含的內容:1,全部的對象:類,域,原生值和引用;2,全部的類:classloader,類名,超類,靜態(tài)域;3,GCroot:被JVM定義的可觸達的對象;4,線程棧和本地變量:線程的callstack,本地對象每幀的信息。dump文件不包含內存的分配信息,因此無法查詢誰創(chuàng)建了哪個對象這樣的信息。Shallo
2、wheap是一個對象占用的內存空間,一個對象需要32或者64bits。RetainedsetofX是X在被jvmgc回收后被remove的一組object。RetainedheapofX是在retainedsetofX中的所有對象的shallowheapsize的和。換句話說就是保持X活著需要的內存空間。通俗的講,shallowheap是一個對象在內存中的實際空間,而retainedheap是一個對象被gc回收后內存釋放出來的空間。這張圖可以看懂什么是leadingset什么是retainedset。Dominatortree:定義一個對象xd
3、ominate對象y,當每一條從root開始到y(tǒng)的路徑都經(jīng)過x。說白了就是只要有y對象的存活,那么一定會有一個x對象。Dominatortree就是將對象引用圖轉換成的樹形結構。幫助發(fā)現(xiàn)在對象間保持alive的依賴,同時也能識別出retained內存的最大的chunk。Immediatedominatorxofy是離y最近的dominator。Dominatortree有幾個屬性:1,對象x的子樹包含的對象(xdominate的對象集),代表了x的retainedset;2,如果x是y的immediatedominator,那么x的immedi
4、atedominator同樣dominatey,以此類推;3,dominatetree中的邊不代表對象引用圖里對應的邊,并非嚴格的直接的對象引用。這張圖反應了一個對象引用圖轉換成dominatortree的示例。Gcroot:一個gc根就是一個對象,這個對象從堆外可以訪問讀取。以下一些方法可以使一個對象成為gc根。1,Systemclass:被Bootstrap或者system類加載器加載的類,比如rt.jar里的java.util.*;2,JNIlocal:native代碼里的local變量,比如用戶定義的JNI代碼和JVM的內部代碼;3,J
5、NIglobal:native代碼里的global變量;4,Threadblock:當前活躍的線程block中引用的對象;5,Thread:已經(jīng)啟動并且沒有stop的線程;6,busymonitor:被調用了wait()或者notify()或者被synchronized同步的對象,如果是synchronized方法,那么靜態(tài)方法指的類,非靜態(tài)方法指的是對象;7,javalocal:local變量,比如方法的入?yún)⒑头椒▋葎?chuàng)建的變量;8,nativestack:native代碼里的出入?yún)?shù),比如file/net/IO方法以及反射的參數(shù);9,fina
6、lizable:在一個隊列里等待它的finalizer運行的對象;10,unfinalized:一個有finalize方法的對象,還沒有被finalize,同時也沒有進入finalizer隊列等待finalize;11,unreachable:不會被觸碰到的對象,在MAT里被標記為root用來retainobject,否則是不會在分析中出現(xiàn)的;12,javastackframe:java棧幀包含了本地變量,當dump被解析時且在preferences里設置過把棧幀當做對象,這時才會產(chǎn)生;13,unknown:位置的root類型。接下來是一些獲取
7、dump的方法:1,在oom時dump:JVM參數(shù):-XX:+HeapDumpOnOutOfMemoryError2,交互式環(huán)境下dump:1)JVM參數(shù):-XX:+HeapDumpOnCtrlBreak2)用外部tools:jmap-dump:format=b,file=3)用外部tools:jconsole4)用外部工具:MAT5)kill-36)jstack-l>一些排查方法:1,通過topconsumers查找大對象,可以按照class、classload
8、er和package進行groupby;2,通過immediatedominator找到責任對象,對于快速定位一組對象的持有者非常有用,這個操作直接解