在用mat工具分析內存使用情況查詢OutOfMemory原因時,OQL會有很大幫助,所以先在這里總結一下。
基本語法:
select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]
select * from com.XXX.CacheManager
解釋:
(1)class name是java類的完全限定名,如:java.lang.String, java.util.ArrayList, [C是char數組, [Ljava.io.File是java.io.File[]
(2)類的完全限定名不足以唯一的辨識一個類,因為不同的ClassLoader載入的相同的類,它們在jvm中是不同類型的
(3)instanceof表示也查詢某一個類的子類,如果不明確instanceof,則只精確查詢class name指定的類
(4)from和where子句都是可選的
(5)java域表示:obj.field_name;java數組表示:array[index]
舉例:
(1)查詢長度大於100的字符串 select s from java.lang.String s where s.count > 100
select * from java.util.concurrent.linkedBlockingQueue t where (t.count.value>0)
(2)查詢長度大於256的數組 select a from [I a where a.length > 256
(3)顯示匹配某一正則表達式的字符串 select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)顯示所有文件對象的文件路徑 select file.path.value.toString() from java.io.File file
(5)顯示所有ClassLoader的類名 select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)通過引用查詢對象 select o from instanceof 0xd404d404 o
built-in對象 -- heap
(1)heap.findClass(class name) -- 找到類
select heap.findClass("java.lang.String").superclass
(2)heap.findObject(object id) -- 找到對象
select heap.findObject("0xd404d404")
(3)heap.classes -- 所有類的枚舉
select heap.classes
(4)heap.objects -- 所有對象的枚舉
select heap.objects("java.lang.String")
(5)heap.finalizables -- 等待垃圾收集的java對象的枚舉
(6)heap.livepaths -- 某一對象存活路徑
select heaplivepaths(s) from java.lang.String s
(7)heap.roots -- 堆根集的枚舉
