天天看點

MAT 專題

​​http://smallnetvisitor.iteye.com/blog/1826434​​

運作user任務管理器檢視到的pid号:

MAT 專題

基于jmap導出的堆資訊:

MAT 專題
jmap -dump:live,format=b,file=dump.bin pid
使用jmap來抓dump,在抓dump的時候,我們會把堆全部扒下來:
jmap -dump:format=b,file=path pid

然後會生成一個幾百M的包,讓運維人員從生産環境拖下來再傳給你,然後你用jvisualvm打開,等你打開這個dump的時候,看到你想看的記憶體的時候,基本上半天時間已經過去了。

其實我們丢了一個很重要的參數:live,這個參數表示我們需要抓取目前在生命周期内的記憶體對象,也就是說GC收不走的對象,然後我們絕大部分情況下,需要的看的就是這些記憶體。如果我們把這個參數加上:

jmap -dump:live,format=b,file=path pid

那麼抓下來的dump會減少一個數量級,在幾十M左右,這樣我們傳輸,打開這個dump的時間将大大減少,為解決故障赢取了寶貴的時間。      

用裝了mat插件的eclipse打開firstHeap.bin檔案

選擇Leak Suspects Reports模式,finish

MAT 專題

點選details

MAT 專題
MAT 專題

這些對象有可能會溢出,然後我們打開OQL視窗

MAT 專題

執行如下OQL語句

MAT 專題
MAT 專題

也就是說這個是null,但是仍然有強引用存在,gc的時候是不能回收的,這樣就會出現記憶體的溢出問題

不懂就按F1,關于OQL有詳細介紹,或進官網  mat Querying Heap Objects:http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.mat.ui.help%2Ftasks%2Fqueryingheapobjects.html

MAT 專題

一步一個腳印,友善自己複習,該出手時就出手,有錯誤,一定要指正,非常感謝,共同進步!

所有包含Heap Profling功能的工具(MAT,IBM HA, Yourkit, JProfiler, TPTP等)都會使用到兩個名詞,一個是Shallow Size,另一個是 Retained Size.

這是兩個在平時不太常見的名詞,本文會對這兩個名詞做一個詳細的解釋。

Shallow Size

對象自身占用的記憶體大小,不包括它引用的對象。

針對非數組類型的對象,它的大小就是對象與它所有的成員變量大小的總和。當然這裡面還會包括一些java語言特性的資料存儲單元。

針對數組類型的對象,它的大小是數組元素對象的大小總和。

Retained Size

Retained Size=目前對象大小+目前對象可直接或間接引用到的對象的大小總和。(間接引用的含義:A->B->C, C就是間接引用)

換句話說,Retained Size就是目前對象被GC後,從Heap上總共能釋放掉的記憶體。

不過,釋放的時候還要排除被GC Roots直接或間接引用的對象。他們暫時不會被被當做Garbage。

看圖了解Retained Size

MAT 專題

上圖中,GC Roots直接引用了A、B和D三個對象。

A對象的Retained Size=A對象的Shallow Size

B對象的Retained Size=B對象的Shallow Size + C對象的Shallow Size

這裡不包括D對象,因為D對象被GC Roots直接引用。

如果GC Roots不引用D對象呢?

MAT 專題

此時,

B對象的Retained Size=B對象的Shallow Size + C對象的Shallow Size + D對象的Shallow Size

​​http://bjyzxxds.iteye.com/blog/1532937​​​

JVM 記憶體分析神器 MAT: Incoming Vs Outgoing References 你真的了解嗎?

Incoming References:  引用了目前對象的對象

Outgoing References:  目前對象引用的對象

讓我們通過示例來了解有關 Incoming references 和 Outgoing references 的更多知識。例如,一個應用程式的源代碼如下所示

public class A {
     private C c1 = C.getInstance();
}
public class B {
     private C c2 = C.getInstance();
}
public class C {
     private static C myC = new C();
     public static C getInstance() {
             return myC;
     }
     private D d1 = new D();
     private E e1 = new E();
}
public class D {
}
public class E {
}
public class SimpleExample {
     public static void main (String argsp[]) throws Exception {
            A a = new A();
            B b = new B();
     }
}      

現在,如果要為上述示例應用程式以圖形方式繪制對象,則其外觀将如下所示:

MAT 專題

圖 1:示例應用程式的對象引用圖

對象 A 和對象 B 持有對象 C 的引用

對象 C 持有對象 D 和對象 E 的引用

在這個示例項目中,讓我們具體分析下對象 C 的 Incoming references 和 Outgoing references 。

對象 C 的 Incoming References

擁有對象 C 的引用的所有對象都稱為 Incoming references。

MAT 專題

在此示例中,對象 C 的“Incoming references”是對象 A、對象 B 和 C 的類對象 。

為了證明這個判斷,我們從上述示例應用程式中捕獲了堆 Dump 檔案,并将其載入到 Eclipse MAT 中進行分析。

下圖是 Eclipse MAT 針對對象 C 報告的 Incoming references

MAT 專題

在"Dominator Tree"中的 Object C 上單擊滑鼠右鍵,然後選擇"List Objects",再選擇 ”with incoming references“時,Eclipse MAT 會生成上圖的報告。報告中展示對象 C 的 Incoming references 為對象 A、對象 B 和 C 的類對象。

Eclipse MAT 還顯示了用于引用對象 C 的變量,可以看到使用變量“c1”引用對象 C 的對象 A,類似地,還報告了用于引用對象 C 的其他變量。

對象 C 的 Outgoing References

對象 C 引用的所有對象都稱為 Outgoing References。

MAT 專題

在此示例中,對象 C 的“outgoing references”是對象 D、對象 E 和 C 的類對象。以下是 Eclipse MAT 針對對象 C Outgoing references 的報告

MAT 專題

在"Dominator Tree"中的 Object C 上單擊滑鼠右鍵,然後選擇"List Objects",再選擇 ”with incoming references“時,Eclipse MAT 會生成上圖的報告。報告中展示對象 C 的 Incoming references 為對象 D、對象 E 和 C 的類對象。Eclipse MAT 還按顯示對象 C 引用的其他對象。可以看到對象 C 使用變量 d1 引用了對象 D。類似地,報告還顯示了對象 C 中使用的其他變量。

通過本文主要闡述了 Incoming references and Outgoing references 之間的差別。

原文:https://dzone.com/articles/eclipse-mat-incoming-outgoing-references

​​​https://cloud.tencent.com/developer/article/1530223​​

MAT上展示的預設機關是Byte

MAT 專題
MAT 專題

繼續閱讀