以下內容翻譯自MAT幫助文檔。
MAT下載地址 http://www.eclipse.org/mat/
一、Class Histogram
Class Histogram shows the classes found in the snapshot, the number of objects for each class, the heap memory consumption of these objects, and the minimum retained size of the objects
二、Dominator tree
Dominator tree shows for a particular object which other objects depend on it and will be garbage collected if that particular object becomes unreachable.
三、Paths to GC roots
This view find objects responsible for keeping the selected object in the heap.
Componenet report A heap dump contains many objects. But which of those belong to your component? And what conclusions can you draw from them? This is where the Component Report can help。
四、OQL
OQL is the build-in object query language. Learn to perform custom SQL-like queries on the heap dump in one minute. classes as tables, objects as rows, and fields as columns。
1、OQL-SELECT
1.SELECT * FROM java.lang.String
2.SELECT toString(s), s.count, s.value FROM java.lang.String s
3.SELECT toString(s) AS Value,s.@usedHeapSize AS "Shallow Size" FROM java.lang.String s
(@爲屬性訪問器,可以使用AS起個別名)
4.SELECT AS RETAINED SET * FROM java.lang.String
(使用AS RETAINED SET 獲得與選擇對象相關聯的對象集合)
5.SELECT OBJECTS dominators(s) FROM java.lang.String s
(OBJECTS 關鍵字使得dominators 返回二維數組簡化爲一維對象列表)
6.SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s
(DISTINCT 去重複)
7、查詢所有的異常對象
SELECT * FROM INSTANCEOF java.lang.Exception exceptions
SELECT exceptions.@displayName, exceptions.detailMessage.toString() FROM INSTANCEOF java.lang.Exception exceptions
2、OQL-FROM
1.SELECT * FROM "java\.lang\..*"
(支持正則)
2.SELECT * FROM java.lang.String
3.SELECT * FROM 0xe14a100
(根據類對象在堆轉儲快照中的地址查詢)
4.SELECT * FROM 3022
(根據對象在堆轉儲快照中的地址ID)
5.SELECT * FROM ( SELECT * FROM java.lang.Class c )
6.SELECT * FROM ${snapshot}.getClasses()
(使用屬性訪問器)
7.SELECT * FROM INSTANCEOF java.lang.ref.Reference
(INSTANCEOF 會把指定類的子類也查詢出來)
8.SELECT * FROM OBJECTS java.lang.String
(OBJECTS 禁止OQL把查詢範圍解釋爲對象實例,上述結果爲java.lang.String對應的Class)
3、OQL-WHERE
1.SELECT * FROM java.lang.String s WHERE s.count >= 100
2.SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*day"
3.SELECT * FROM java.lang.String s WHERE s.value NOT IN dominators(s)
4.SELECT * FROM java.lang.String s WHERE toString(s) = "monday"
5.SELECT * FROM java.lang.String s WHERE s.count > 100 AND s.@retainedHeapSize > s.@usedHeapSize
6.SELECT * FROM java.lang.String s WHERE s.count > 1000 OR s.value.@length >1000
7.SELECT * FROM java.lang.String s WHERE (s.count > 1000) = true
WHERE toString(s) = "monday"
WHERE dominators(s).size() = 0
WHERE s.retainedHeapSize > 1024L
WHERE s.@GCRootInfo != null
4、屬性訪問器
1.[<alias>.]<field>.<field>.……
(訪問堆轉儲快照中對象的字段)
2.[<alias>.]@<attribute>……
(訪問java bean屬性)
目標 | 接口 | 屬性 | 含義 |
任意堆中的對象 | Iobject | objectId | 快照中對象的ID |
objectAddress | 快照中對象的地址 | ||
Class | 對象所屬的類 | ||
usedHeapSize | 對象的shallowSize | ||
retainedHeapSize | 對象的retainedSize | ||
displayName | 對象的顯示名稱 | ||
類對象 | Iclass | classLoaderId | 類加載器Id |
任意數組 | Iarray | length | 數組的長度 |
5、OQL 內建函數
.[<alias>.]@<方法>([<表達式>,<表達式>])……
(調用OQL java方法,加“()”會令MAT解釋爲一個OQL java調用)
常見的OQL java方法
目標 | 接口 | 屬性 | 含義 |
$snapshot | Isnapshot | getClasses() | 獲取所有類的集合 |
getClassesByName(String name,boolean includeSubClasses) | 獲取指定類的集合 | ||
Class object | Iclass | hasSuperClass() | 如果對象有父類則返回true |
isArrayType() | 如果Class是數組類型則返回true |