国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

如何理解java中MAT對OQL的支持

發(fā)布時(shí)間:2021-09-27 17:50 來(lái)源:億速云 閱讀:0 作者:柒染 欄目: 開(kāi)發(fā)技術(shù)

這篇文章將為大家詳細講解有關(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)行對象的查找和篩選。

1. Select子句

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

2. From子句

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)的地址的好處是可以區分被不同ClassLoader加載的同一種類(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.ArrayListjava.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)鍵字是完全不同的。

3. Where子句

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
4 內置對象與方法

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)pathvalue屬性。

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對象的內容、objectidobjectAddress。

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í),將立刻刪除涉嫌侵權內容。

欧美午夜精品一区二区蜜桃| 奇米精品视频一区二区三区| 国产精品久久777777| 又大又粗又爽又黄的少妇毛片| 亚洲成熟人网站| 亚洲欧美牲交|