jvm 物件查詢語言(OQL)簡介

Coding-lover發表於2015-11-09

SELECT子句

SELECT子句用於確定查詢語句需要從堆轉儲快照中選擇什麼內容。如果需要顯示堆轉儲快照中的物件,並且瀏覽這些物件的引用關係,可以使用“*”,這與傳統SQL語句中的習慣是一致的,如:

SELECT * FROM java.lang.String

1.選擇特定的顯示列

查詢也可以選擇特定的需要顯示的欄位,如:

SELECT toString(s),s.count,s.value FROM java.lang.String s

查詢可以用“@”符號來使用Java物件的記憶體屬性訪問器。MAT提供了一系列的內建函式來獲取與分析相關的資訊,如:

SELECT toString(s),s.@usedHeapSize,s.@retainedHeapSize FROM java.lang.String s

關於物件屬性訪問器的具體內容,可以參見下文的“屬性訪問器”。

2.使用列別名

可以使用AS關鍵字來對選擇的列進行命名,如:

SELECT toString(s)AS Value,
s.@usedHeapSize AS"Shallow Size",
s.@retainedHeapSize AS"Retained Size"
FROM java.lang.String s

可以使用“AS RETAINED SET”關鍵字來獲得與選擇物件相關聯的物件集合,如:

SELECT AS RETAINED SET * FROM java.lang.String

3.拼合成為一個物件列表選擇專案

可以使用“OBJECTS”關鍵字把SELECT子句中查詢出來的資料專案轉變為物件,如:

SELECT OBJECTS dominators(s)FROM java.lang.String s

上面例子中,函式“dominators()”將會返回一個物件陣列,因此,如果沒有“OBJECTS”關鍵字,上面的查詢將返回一組二維的物件陣列的列表。通過使用關鍵字“OBJECTS”,我們迫使OQL把查詢結果縮減為一維的物件列表。

4.排除重複物件

使用“DISTINCT”關鍵字可以排除結果集中的重複物件,如:

SELECT DISTINCT classof(s)FROM java.lang.String s

上面的例子中,函式“classof()”的作用是返回物件所屬的Java類,當然,所有字串物件的所屬類都是java.lang.String,因此,如果上面的查詢中沒有加入DISTINCT關鍵字,查詢結果就會返回與快照中的字串數量一樣多的行記錄,並且每行記錄的內容都是java.lang.String型別。

注:本附錄翻譯自Eclipse Memory Analyzer Tool(MAT,Eclipse出品的記憶體分析工具)的OQL幫助文件。

轉載自:深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)

相關文章