軟件構造 - OQL語言查詢內存導出文件

內容主要來自JDK 1.8的JVM監控工具jhat中關於OQL的英文幫助說明
以及Eclipse Memory Analyzer中對OQL使用的幫助文檔
以及兩位CSDN博主的博客整理(博客地址在本文最後)

基本語法:

select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]

解釋:
(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)可以使用obj.field_name語法訪問Java字段,並且可以使用array [index]語法訪問數組元素

內置對象
堆對象:
(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 – 堆根集的枚舉

辨識對象的函數
(1)classof(class name) – 返回java對象的類對象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) – 返回是否兩個對象是同一個實例
select identical(heap.findClass(“java.lang.String”).name, heap.findClass(“java.lang.String”).name)
(3)objectid(object) – 返回對象的id
select objectid(s) from java.lang.String s
(4)reachables – 返回可從對象可到達的對象
select reachables§ from java.util.Properties p – 查詢從Properties對象可到達的對象
select reachables(u, “java.net.URL.handler”) from java.net.URL u – 查詢從URL對象可到達的對象,但不包括從URL.handler可到達的對象
(5)referrers(object) – 返回引用某一對象的對象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) – 返回某一對象引用的對象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) – 返回是否第一個對象引用第二個對象
select refers(heap.findObject(“0xd4d4d4d4”),heap.findObject(“0xe4e4e4e4”))
(8)root(object) – 返回是否對象是根集的成員
select root(heap.findObject(“0xd4d4d4d4”))
(9)sizeof(object) – 返回對象的大小
select sizeof(o) from [I o
(10)toHtml(object) – 返回對象的html格式
select “” + toHtml(o) + “” from java.lang.Object o
(11)選擇多值
select {name:t.name?t.name.toString():“null”,thread:t} from instanceof java.lang.Thread t

數組、迭代器等函數
(1)concat(enumeration1,enumeration2) – 將數組或枚舉進行連接
select concat(referrers§,referrers§) from java.util.Properties p
(2)contains(array, expression) – 數組中元素是否滿足某表達式
select p from java.util.Properties where contains(referres§, “classof(it).name == ‘java.lang.Class’”)
返回由java.lang.Class引用的java.util.Properties對象
built-in變量
it – 當前的迭代元素
index – 當前迭代元素的索引
array – 被迭代的數組
(3)count(array, expression) – 滿足某一條件的元素的數量
select count(heap.classes(), “/java.io./(it.name)”)
(4)filter(array, expression) – 過濾出滿足某一條件的元素
select filter(heap.classes(), “/java.io./(it.name)”)
(5)length(array) – 返回數組長度
select length(heap.classes())
(6)map(array,expression) – 根據表達式對數組中的元素進行轉換映射
select map(heap.classes(),“index + ‘–>’ + toHtml(it)”)
(7)max(array,expression) – 最大值, min(array,expression)
select max(heap.objects(“java.lang.String”),“lhs.count>rhs.count”)
built-in變量
lhs – 左邊元素
rhs – 右邊元素
(8)sort(array,expression) – 排序
select sort(heap.objects(’[C’),‘sizeof(lhs)-sizeof(rhs)’)
(9)sum(array,expression) – 求和
select sum(heap.objects(’[C’),‘sizeof(it)’)
(10)toArray(array) – 返回數組
(11)unique(array) – 唯一化數組

舉例:
(1)查詢長度大於100的字符串
select s from java.lang.String s where s.count > 100
(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

實際應用:
查詢OrbitofStellarSystem類的所有對象實例
在這裏插入圖片描述
查詢PhysicalObject.Planet類的所有對象實例
在這裏插入圖片描述
查詢的是String長度超過100的對象個數
在這裏插入圖片描述
查詢的是ArrayList元素數量超過100的實例
在這裏插入圖片描述
查詢的是HashMap元素數量超過100的實例
在這裏插入圖片描述

參考資料:
https://blog.csdn.net/gtuu0123/article/details/6039592
https://blog.csdn.net/pange1991/article/details/82023771

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