<?xml version="1.0" encoding="UTF-8"?> | |
<!-- | |
Copyright (c) 2008, 2023 SAP AG, IBM Corporation and others. | |
All rights reserved. This program and the accompanying materials | |
are made available under the terms of the Eclipse Public License 2.0 | |
which accompanies this distribution, and is available at | |
https://www.eclipse.org/legal/epl-2.0/ | |
SPDX-License-Identifier: EPL-2.0 | |
Contributors: | |
SAP AG - initial API and implementation | |
IBM Corporation - autocompletion | |
--> | |
<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "reference.dtd" > | |
<reference id="ref_oqlsyntaxfrom" xml:lang="en-us"> | |
<title>FROM Clause</title> | |
<shortdesc /> | |
<prolog> | |
<copyright> | |
<copyryear year=""></copyryear> | |
<copyrholder> | |
Copyright (c) 2008, 2023 SAP AG and others. | |
All rights reserved. This program and the accompanying materials | |
are made available under the terms of the Eclipse Public License 2.0 | |
which accompanies this distribution, and is available at | |
https://www.eclipse.org/legal/epl-2.0/ | |
</copyrholder> | |
</copyright> | |
</prolog> | |
<refbody> | |
<section> | |
<title>Specify the class</title> | |
<p> | |
The <codeph>FROM</codeph> clause defines the classes on which to operate. | |
Specify the class by one of the following means: | |
</p> | |
<b>by class name:</b> | |
<codeblock>SELECT * FROM java.lang.String</codeblock> | |
<b>by a regular expression matching the class name:</b> | |
<codeblock>SELECT * FROM "java\.lang\..*"</codeblock> | |
<b>by the object address of the class:</b> | |
<codeblock>SELECT * FROM 0x2b7468c8</codeblock> | |
<b>by the object addresses of more than one class:</b> | |
<codeblock>SELECT * FROM 0x2b7468c8,0x2b74aee0</codeblock> | |
<b>by the object id of the class:</b> | |
<codeblock>SELECT * FROM 20815</codeblock> | |
<b>by the object ids of more than one class:</b> | |
<codeblock>SELECT * FROM 20815,20975</codeblock> | |
<b>by a sub select:</b> | |
<codeblock>SELECT * FROM ( SELECT * | |
FROM java.lang.Class c | |
WHERE c implements org.eclipse.mat.snapshot.model.IClass )</codeblock> | |
<p> | |
The statement returns all objects in the heap. The | |
<codeph>implements</codeph> | |
check is necessary, as the heap dump can contain | |
<codeph>java.lang.Class</codeph> | |
instances caused by proxy classes or classes representing | |
primitive types such as | |
<codeph>int.class</codeph> or <codeph>Integer.TYPE</codeph>. | |
The following query has | |
the same effect, which calls a method directly on | |
the ISnapshot object: | |
</p> | |
<codeblock>SELECT * FROM ${snapshot}.getClasses()</codeblock> | |
</section> | |
<section> | |
<title>Include sub classes</title> | |
<p> | |
Use the | |
<codeph>INSTANCEOF</codeph> | |
keyword to include objects of sub-classes into the | |
query: | |
</p> | |
<codeblock>SELECT * FROM INSTANCEOF java.lang.ref.Reference</codeblock> | |
<p> | |
The resulting table contains, amongst others, | |
WeakReference and SoftReference objects because both | |
classes extend from | |
<codeph>java.lang.ref.Reference</codeph> | |
. By the way, the same result has the following query | |
</p> | |
<codeblock>SELECT * FROM ${snapshot}.getClassesByName("java.lang.ref.Reference", true)</codeblock> | |
</section> | |
<section> | |
<title> | |
Prevent interpretation of the from term as classes | |
</title> | |
<p> | |
Use the OBJECTS keyword if you do not want to process | |
the term as classes. | |
Specify the object or objects by one of the following means: | |
</p> | |
<b>by class name:</b> | |
<codeblock>SELECT * FROM OBJECTS java.lang.String</codeblock> | |
<p> | |
The result is just one object, the java.lang.String | |
class object. | |
</p> | |
<b>by the object address of the particular object:</b> | |
<codeblock>SELECT * FROM OBJECTS 0x2b7468c8</codeblock> | |
<b>by the object addresses of particular objects:</b> | |
<codeblock>SELECT * FROM OBJECTS 0x2b7468c8,0x2b746868</codeblock> | |
<b>by the object id of the particular object:</b> | |
<codeblock>SELECT * FROM OBJECTS 20815</codeblock> | |
<b>by the object ids of particular objects:</b> | |
<codeblock>SELECT * FROM OBJECTS 20815,20814</codeblock> | |
<b>by a sub expression (Memory Analyzer 1.4 or later):</b> | |
<codeblock>SELECT * FROM OBJECTS (1 + ${snapshot}.GCRoots.length)</codeblock> | |
<b>by a sub select returning an object list</b> | |
<codeblock>SELECT v, v.@length FROM OBJECTS ( SELECT OBJECTS s.value FROM java.lang.String s ) v</codeblock> | |
<b>In Memory Analyzer 1.10 and later, sub-selects are now also permitted which have select items.</b> | |
<codeblock>SELECT v,v.s,v.val FROM OBJECTS ( SELECT s,s.value as val FROM java.lang.String s ) v</codeblock> | |
See <xref format="html" scope="peer" href="https://wiki.eclipse.org/MemoryAnalyzer/OQL#Sub_SELECT_with_select_items">Wiki Sub select with select items</xref> | |
for more details. | |
<note> | |
Please note, that currently the <codeph>FROM OBJECTS</codeph> term is in | |
the test phase! | |
</note> | |
</section> | |
<section id="unindexed"> | |
<title> | |
Unindexed objects | |
</title> | |
<p> | |
Normally heap objects are indexed in the snapshot and are referred to | |
by an object id, not an address. | |
If objects have been discarded from the snapshot during parsing, | |
either because they are unreachable, or because of the discard option | |
then sometimes they can still be accessed in OQL. | |
If you know the object address, then a query such as | |
<codeblock>SELECT * FROM OBJECTS 0x2b7468c8</codeblock> | |
will retrieve it. | |
The result of the query is different however. Instead of the | |
object being processed as an object id and displayed in a | |
list objects query tree view, it is returned as part of a list | |
of IObject and is displayed as a table view. | |
</p> | |
<p>Unindexed objects will not be returned as a result of | |
<ul> | |
<li><codeph>outbound()</codeph> | |
</li> | |
<li><codeph>inbound()</codeph> | |
</li> | |
<li><codeph>dominators()</codeph> | |
</li> | |
<li><codeph>dominatorof()</codeph> | |
</li> | |
</ul> | |
and will cause an error if supplied as an argument to those | |
functions. | |
The built-in function <codeph>classof()</codeph> does work | |
with unindexed objects. | |
</p> | |
<p>See how unindexed objects appear in the inspector view when | |
retrieved by OQL. Note the | |
<image href="../mimes/message_warning.png"> | |
<alt>yellow warning triangle icon</alt> | |
</image> | |
warning triangle and the <msgph>Unindexed</msgph> | |
in the inspector view top panel, and the <msgph>Unindexed</msgph> suffix | |
in the object view. The retained size is 0 as the retained size is not | |
calculated for unindexed objects. | |
<image href="../mimes/inspector_unindexed.png" scale="66"> | |
<alt>Inspector View with unindexed object"</alt> | |
</image> | |
</p> | |
<note> | |
Please note, that currently the unindexed objects facility is in | |
the test phase! | |
</note> | |
</section> | |
<section> | |
<title> | |
Autocompletion | |
</title> | |
<p> | |
The OQL pane now has autocompletion for class names, class name regular expressions, | |
field names, attributes and methods. | |
See <xref href="tipsandtricks.dita#oqlcompletion">OQL autocompletion</xref>. | |
</p> | |
</section> | |
</refbody> | |
</reference> |