- 摘要:下面內容幾乎全部來自《深入理解java虛擬機》-周志明這本書的附錄D附錄D是作者翻譯自EclipseMemoryAnalyzerTool(MAT)的OQL幫助文檔我覺得對於分析內存使用情況查詢OutOfMemory原因,OQL會有很大幫助,所以先在這裏總結一下SELECT1.SELECT*FROMjava.lang.String2.SELECTtoString(s),s.count,s.valueFROMjava.lang.Strings3.SELECTtoString(s)
-
下面內容幾乎全部來自《深入理解java虛擬機》 - 周志明 這本書的附錄D
附錄D是作者翻譯自Eclipse Memory Analyzer Tool(MAT)的OQL幫助文檔
我覺得對於分析內存使用情況查詢OutOfMemory原因,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,[email protected] 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 去重複)
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)
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 [email protected] > [email protected]
6.SELECT * FROM java.lang.String s WHERE s.count > 1000 OR [email protected] >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 [email protected] != null
屬性訪問器
1.[<alias>.]<field>.<field>.……
(訪問堆轉儲快照中對象的字段)
2.[<alias>.]@<attribute>……
(訪問java bean屬性)
目標 接口 屬性 含義 任意堆中的對象 Iobject objectId 快照中對象的ID objectAddress 快照中對象的地址 Class 對象所屬的類 usedHeapSize 對象的shallowSize retainedHeapSize 對象的retainedSize displayName 對象的顯示名稱 類對象 Iclass classLoaderId 類加載器Id 任意數組 Iarray length 數組的長度 3.[<alias>.]@<方法>([<表達式>,<表達式>])……
(調用OQL java方法,加“()”會令MAT解釋爲一個OQL java調用)
常見的OQL java方法
目標 接口 屬性 含義 $snapshot Isnapshot getClasses() 獲取所有類的集合 getClassesByName(String name,boolean includeSubClasses) 獲取指定類的集合 Class object Iclass hasSuperClass() 如果對象有父類則返回true isArrayType() 如果Class是數組類型則返回true 4.<function>(<parameter>)
(OQL 內建函數)
函數名稱 作用 toHex(number) 以16進制的形式打印數字 toString(object) 返回對象的值 dominators(object) 返回直接持有指定對象的對象列表 outbounds(object) 獲取對象的外部引用 inbounds(object) 獲取對象的內部引用 classof(object) 獲取對象所屬的類型對象 dominatorof(object) 返回直接持有當前對象的對象列表,如果沒有,返回-1 BNF範式
以下內容來自百度百科
巴科斯範式義同BNF範式(BNF: Backus-Naur Form 的縮寫)描述計算機語言語法的符號集
1.在雙引號中的字("word")代表着這些字符本身。而double_quote用來代表雙引號。
2.在雙引號外的字(有可能有下劃線)代表着語法部分。
3.尖括號( < > )內包含的爲必選項。
4.方括號( [ ] )內包含的爲可選項。
5.大括號( { } )內包含的爲可重複0至無數次的項。
6.豎線( | )表示在其左右兩邊任選一項,相當於"OR"的意思。
7::= 是“被定義爲”的意思OQL語言的BNF範式
(由於本人都不知道範式是啥能幹啥,所以先略過吧,等用到的時候再來補上)
筆記如下
其中“調用OQL java方法”由於我機器上的XMIND有個bug,所以無法正確輸入
[<alias>.]@<方法>([<表達式>, <表達式>])……
<表達式> 之間應該有逗號