- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 如何理解java中MAT對OQL的支持
這篇文章將為大家詳細講解有關(guān)如何理解java中MAT對OQL的支持,文章內容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
MAT
支持一種類(lèi)似于SQL的查詢(xún)語(yǔ)言OQL(Object Query Language
)。OQL使用類(lèi)SQL語(yǔ)法,可以在堆中進(jìn)行對象的查找和篩選。
在MAT
中,Select
子句的格式與SQL基本一致,用于指定要顯示的列。Select
子句中可以使用“*
”,查看結果對象的引用實(shí)例(相當于outgoing references
)。
select * from java.util.Vector v
以上查詢(xún)的輸出如圖所示,在輸出結果中,結果集中的每條記錄都可以展開(kāi),查看各自的引用對象。
OQL還可以指定對象的屬性進(jìn)行輸出,下例輸出所有Vector
對象的內部數組,輸出結果如圖所示。使用“OBJECTS
”關(guān)鍵字,可以將返回結果集中的項以對象的形式顯示。
SELECT OBJECTS v.elementData FROM java.util.Vector v
在Select
子句中,使用“AS RETAINED SET
”關(guān)鍵字可以得到所得對象的保留集。下例得到jvm.chapter07.Student
對象的保留集。
SELECT AS RETAINED SET * FROM jvm.chapter07.Student
“DISTINCT
”關(guān)鍵字用于在結果集中去除重復對象。下例的輸出結果中只有一條“class java.lang.String
”記錄。如果沒(méi)有“DISTINCT
”,那么查詢(xún)將為每個(gè)String
實(shí)例輸出其對應的Class
信息。
SELECT DISTINCT OBJECTS classof(s) FROM java.lang.String s
From
子句用于指定查詢(xún)范圍,它可以指定類(lèi)名、正則表達式或者對象地址。
下例使用From
子句,指定類(lèi)名進(jìn)行搜索,并輸出所有的java.lang.String
實(shí)例。
SELECT * FROM java.lang.String s
下例使用正則表達式,限定搜索范圍,輸出所有java.lang包下所有類(lèi)的實(shí)例,如圖所示。
SELECT * FROM "jvm\.chapter07\..*"
也可以直接使用類(lèi)的地址進(jìn)行搜索。使用類(lèi)的地址的好處是可以區分被不同ClassLoade
r加載的同一種類(lèi)型。下例中“0x37a014d8
”為類(lèi)的地址。
select * from 0x37a014d8
有多種方法可以獲得類(lèi)的地址,在 MAT
中,一種最為簡(jiǎn)單的方法如圖所示。
在From
子句中,還可以使用“INSTANCEOF
”關(guān)鍵字,返回指定類(lèi)的所有子類(lèi)實(shí)例。下例的查詢(xún)返回了當前堆快照中所有的抽象集合實(shí)例,包括java.util.Vector
、java.util.ArrayList
和java.util.HashSet
等。
SELECT * FROM INSTANCEOF java.util.AbstractCollection
在From
子句中,還可以使用“OBJECTS
”關(guān)鍵字。使用“OBJECTS
”關(guān)鍵字后,那么原本應該返回類(lèi)的實(shí)例的查詢(xún),將返回類(lèi)的信息。
SELECT * FROM OBJECTS java.lang.String
以上查詢(xún)的返回結果如圖所示。它僅返回一條記錄,表示java.lang.String
的類(lèi)的信息。
如果不使用“OBJECTS
”關(guān)鍵字,這個(gè)查詢(xún)將返回所有的java.lang.String
實(shí)例:
“OBJECTS
”關(guān)鍵字也支持與正則表達式一起使用。下面的查詢(xún),返回了所有滿(mǎn)足給定正則表達式的所有類(lèi),其結果如圖所示。
SELECT * FROM OBJECTS "jvm\.chapter07\..*"
注意:在From子句中使用OBJECTS關(guān)鍵字,將返回符合條件的類(lèi)信息,而非實(shí)例信息。這與Select子句中的OBJECTS關(guān)鍵字是完全不同的。
Where
子句用于指定OQL的查詢(xún)條件。OQL查詢(xún)將只返回滿(mǎn)足Where
子句指定條件的對象。Where
子句的格式與傳統SQL極為相似。
下例返回長(cháng)度大于10的char數組。
SELECT * FROM char[] s WHERE s.@length>10
下例返回包含“java”子字符串的所有字符串,使用“LIKE
”操作符,“LIKE
”操作符的操作參數為正則表達式。
SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*java.*"
下例返回所有value域不為null的字符串,使用“=”操作符。
SELECT * FROM java.lang.String s where s.value!=null
Where子句支持多個(gè)條件的AND、OR運算。下例返回數組長(cháng)度大于15,并且深堆大于1000字節的所有Vector對象。
SELECT * FROM java.util.Vector v WHERE v.elementData.@length>15 AND v.@retainedHeapSize>1000
OQL中可以訪(fǎng)問(wèn)堆內對象的屬性,也可以訪(fǎng)問(wèn)堆內代理對象的屬性。訪(fǎng)問(wèn)堆內對象的屬性時(shí),格式如下:
[ <alias>. ] <field> . <field>. <field>
其中alias
為對象名稱(chēng)。
下例訪(fǎng)問(wèn)java.io.File
對象的path
屬性,并進(jìn)一步訪(fǎng)問(wèn)path
的value
屬性。
SELECT toString(f.path.value) FROM java.io.File f
以上查詢(xún)得到的結果如圖所示。
這些堆內對象的屬性與Java對象一致,擁有與Java對象相同的結果。
MAT為了能快捷地獲取堆內對象的額外屬性(比如對象占用的堆大小、對象地址等),為每種元類(lèi)型的堆內對象建立了相對應的代理對象,以增強原有的對象功能。訪(fǎng)問(wèn)代理對象的屬性時(shí),使用如下格式:
[ <alias>. ] @<attribute>
其中,alias
為對象名稱(chēng),attribute
為屬性名。
下例顯示了String
對象的內容、objectid
和objectAddress
。
SELECT s.toString(), s.@objectId, s.@objectAddress FROM java.lang.String s
下例顯示了File
對象的對象ID、對象地址、代理對象的類(lèi)型、類(lèi)的類(lèi)型、對象的淺堆大小以及對象的顯示名稱(chēng)。
SELECT f.@objectId, f.@objectAddress, f.@class, f.@clazz, f.@usedHeapSize, f.@displayName FROM java.io.File f
下例顯示java.util.Vector
內部數組的長(cháng)度。
SELECT v.elementData.@length FROM java.util.Vector v
下表整理了MAT代理對象的基本屬性。
除了使用代理對象的屬性,OQL中還可以使用代理對象的方法,使用格式如下:
[ <alias> . ] @<method>( [ <expression>, <expression> ] )
下例顯示int數組中索引下標為2的數據內容。
SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2)
下例顯示對象數組中索引下標為2的對象。
SELECT OBJECTS s.@referenceArray.get(2) FROM java.lang.Object[] s WHERE (s.@length > 2)
下例顯示了當前堆中所有的類(lèi)型。
select * from ${snapshot}.getClasses()
下例顯示了所有的java.util.Vector
對象及其子類(lèi)型,它的輸出如圖所示。
select * from INSTANCEOF java.util.Vector
下例顯示當前對象是否是數組。
SELECT c, classof(c).isArrayType() FROM ${snapshot}.getClasses() c
代理對象的方法整理如表所示。
MAT的OQL中還內置一些有用的函數,如表所示。
表 OQL中的內置函數
下例顯示所有長(cháng)度為15的字符串內容(JDK 1.7導出的堆)。
SELECT toString(s) FROM java.lang.String s WHERE ((s.value.@length = 15) and (s.value != null))
下例顯示所有jvm.chapter07.Student
對象的直接支配對象。即給定對象回收后,將釋放的對象集合。
SELECT objects dominators(s) FROM jvm.chapter07.Student s
以上查詢(xún)的輸出如圖所示,顯示Student
對象支配3個(gè)Vector
對象。
函數dominatorof()與dominators()的功能相反,它獲取直接支配當前對象的對象。
SELECT distinct objects dominatorof(s) FROM jvm.chapter07.Student s
以上查詢(xún)的輸出如圖所示,顯示所有的Student
對象直接被主線(xiàn)程支配。
注意:函數dominatorof()與dominators()的功能正好相反。dominatorof()用于獲得直接支配當前對象的對象,而dominators()用于獲取直接支配對象。
下例取得引用WebPage
的對象。
SELECT objects inbounds(w) FROM jvm.chapter07.WebPage w
下例取得堆快照中所有在jvm.chapter
包中的存在對象實(shí)例的類(lèi)型,其輸出如圖所示。
SELECT distinct objects classof(obj) FROM "jvm\.chapter07\..*" obj
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站