深入理解java虛擬機(八):java內存分析工具-MAT和OQL

以下內容翻譯自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

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