mat 使用筆記

 

MAT 使用初探

今天線上一個應用的持久區滿了,一直沒有下來,導致一些服務不可用,就用jmap當出內存快照後,用MAT分析內存的基本信息,發現很多地方不會用。找了些資料記錄在下來。

 

1.引用

 

  • Strong reference : 就是我們new出來的對象,但是還是被持有的應用,垃圾回收時不會回收這個應用
  • soft reference   : 我們new出來的對象,但是已經不被具體對象持有,常見的就是緩存中的對象引用,垃圾回收在內存還夠的時候不會回收該部分內存信息,只有在內存不夠時纔會回收這塊引用的對象
  • weak reference   : 當對象不在有強引用時候,垃圾回收時立刻回收。
  • Phantom reference : 不會在內存中出現,因爲它一般是同ReferenceQueue一起出現,來跟蹤對象是否還是保持強引用。

 

 

2.術語

shallow size:對象自身中有的內存大小 

retained size:對象自身大小 + 該對象直接或是間接引用對象的shallow size

GC Roots:所有的對象引用refer chains的起點。

 

 

以上左圖中以object1來說,單獨一個object1大小就是shallow size,object1及所有藍色對象就是該對象直接或是間接引用的就是retained size。

同理右圖中object4還被gc roots引用到,那麼retained size就不包含這個。

 

 

 

 

 

3.實例

3.1導入一個內存文件後,用MAT打開,具體如下圖所表示

 

 

3.2 details:一些基本信息

Size: 153.7 MB Classes: 331 Objects: 4.1m Class Loader: 3 Unreachable Objects Histogram

 

3.3 biggest object by retained size:顯示在內存較大的對象信息

 

list objects -- with outgoing references : 查看這個對象持有的外部對象引用。

list objects -- with incoming references : 查看這個對象被哪些外部對象引用。

 

show objects by class  --  with outgoing references :查看這個對象類型持有的外部對象引用

show objects by class  --  with incoming references :查看這個對象類型被哪些外部對象引用

 

paths to gc root : 顯示不同類型引用(上文中提到的Strong ,soft,weak )到跟節點的路徑。

merge shorest path to gc root : 合併最短路徑到root節點,這個具體沒試過。

 

java basics:

    -- classloader 該對象對應的classloader信息 。

    -- thread details :線程信息

    -- thread stacks  :線程堆棧

    -- find String : 在這個對象中查詢需要的字符串(還不確定,需要再搞下)

    -- group by : 根據某個字段統計出現的個數 

 

java collections:這個暫時沒研究,以後再搞。

 

leak Identification -- top consumers :幾個大消耗內存的對象 

 

 

3.4 可用操作

 

actions:列出每個類型的實例數及大小 。

donimator tree :列出所有對象在整個內存對象中所佔百分比。比較有用。

Top Consumers: 根據類名和包名列出開銷最大的對象。

Duplicate Classes: 查找出在不同classloader中加載的相同類。

 

step by step 方式

 

MAP提供了兩種分析方式:

1.查找內存泄漏的方式分析內存

2.通過組件方式分析內存主要從;空對象,重複對象加載等方面。

這個在第一次加載內存文件,或者可以通過

 

 

總結:

1.首先看retained size最大的那些數據,一般看內存都是想解決內存泄漏問題,可以通過Top Consumers或者是donimator tree等actions。

2.找到最大的數據後,通過list objects -- with outgoing references 查看具體持有了哪些對象,或者通過java basics -- classloader 。查看這個是因爲我們這次因爲perm區滿了,需要查看這個數據。到底還是哪些classloader加載了數據。

 

 

tips:

持久區中存放的數據:

  類信息,方法信息,常量池,靜態變量,對於加載自己的classloader引用、interned strings(字符串駐留)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章