<?xml version="1.0" encoding="UTF-8"?> | |
<!-- | |
Copyright (c) 2008, 2021 SAP AG and IBM Corporation. | |
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 | |
Andrew Johnson (IBM Corporation) - enhancements | |
--> | |
<!DOCTYPE reference PUBLIC "-//OASIS//DTD DITA Reference//EN" "reference.dtd" > | |
<reference id="propertyaccessors" xml:lang="en-us"> | |
<title>Property Accessors</title> | |
<shortdesc /> | |
<prolog> | |
<copyright> | |
<copyryear year="2008"></copyryear> | |
<copyryear year="2021"></copyryear> | |
<copyrholder> | |
Copyright (c) 2008, 2021 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>Accessing fields of the heap object</title> | |
<p> Properties of heap objects are accessed using a simple dot | |
notation:</p> | |
<p> [ <alias>. ] <field> . <field>. | |
<field> | |
</p> | |
<p> | |
An | |
<b>alias</b> | |
can be defined in the | |
<xref href="oqlsyntaxfrom.dita">FROM Clause</xref> | |
to identify the current object, i.e. row in the SQL | |
analogy, on which the OQL statement operates. Without | |
alias, the field is assumed to be one of the fields of | |
the current object. | |
<b>Fields</b> | |
are attributes of the Java objects in the heap dump. Use | |
<xref href="tipsandtricks.dita#oqlcompletion">OQL autocompletion</xref> | |
or the | |
<cmdname>Object Inspector</cmdname> | |
to find out about the available fields of an object. | |
</p> | |
</section> | |
<section> | |
<title>Accessing Java Bean properties</title> | |
<p>[ <alias>. ] @<attribute> ...</p> | |
<p> | |
Using the @ symbol, OQL accesses attributes of the | |
underlying Java objects used by Memory Analyzer to represent | |
objects in the heap dump. The attributes are resolved via | |
Bean Introspection. Use | |
<xref href="tipsandtricks.dita#oqlcompletion">OQL autocompletion</xref> | |
to find the common beans names. | |
The following table lists some | |
commonly used Java attributes. | |
</p> | |
<simpletable relcolwidth="2* 2* 2* 3*" id="javabean_prop"> | |
<strow> | |
<stentry>Any heap object</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#method.summary" format="html">IObject</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getObjectId()" format="html">objectId</xref></stentry> | |
<stentry>id of snapshot object</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getObjectAddress()" format="html">objectAddress</xref></stentry> | |
<stentry>address of snapshot object</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry>class</stentry> | |
<stentry>Java class of this object as a Memory Analyzer object</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getClazz()" format="html">clazz</xref></stentry> | |
<stentry>IClass of this object. See also classof(object).</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getOutboundReferences()" format="html">outboundReferences</xref></stentry> | |
<stentry>The outbound references as a list of | |
<xref href="../doc/org/eclipse/mat/snapshot/model/NamedReference.html">NamedReference</xref> objects | |
from this object: the type as IClass of this object; the fields; the array entries. | |
This is retrieved from the heap dump, not an index, so could contain references | |
to unindexed objects. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getUsedHeapSize()" format="html">usedHeapSize</xref></stentry> | |
<stentry>shallow heap size</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getRetainedHeapSize()" format="html">retainedHeapSize</xref></stentry> | |
<stentry>retained heap size</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getTechnicalName()" format="html">technicalName</xref></stentry> | |
<stentry>the technical name (a combination of the class name and the object address)</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getClassSpecificName()" format="html">classSpecificName</xref></stentry> | |
<stentry>the value from a name resolver, if available, for example a readable value of a String</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getDisplayName()" format="html">displayName</xref></stentry> | |
<stentry>display name, a combination of the technical name and the class specific name</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getSnapshot()" format="html">snapshot</xref></stentry> | |
<stentry>the snapshot containing this object. An alternative to <codeph>${snapshot}</codeph></stentry> | |
</strow> | |
<strow> | |
<stentry>Class object</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IClass.html#method.summary" format="html">IClass</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IClass.html#getClassLoaderId()" format="html">classLoaderId</xref></stentry> | |
<stentry>id of the class loader</stentry> | |
</strow> | |
<strow> | |
<stentry>Any array</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IArray.html#method.summary" format="html">IArray</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IArray.html#getLength()" format="html">length</xref></stentry> | |
<stentry>length of the array</stentry> | |
</strow> | |
<strow> | |
<stentry>Primitive array</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IPrimitiveArray.html#method.summary" format="html">IPrimitiveArray</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IPrimitiveArray.html#getValueArray()" format="html">valueArray</xref></stentry> | |
<stentry>the values in the array</stentry> | |
</strow> | |
<strow> | |
<stentry>Reference array</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObjectArray.html#method.summary" format="html">IObjectArray</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObjectArray.html#getReferenceArray()" format="html">referenceArray</xref></stentry> | |
<stentry>the objects in the array (as long values, the addresses of the objects) | |
Access a particular element using get() and convert to an object using OBJECTS. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Class loader object</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IClassloader.html#method.summary" format="html">IClassLoader</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IClassLoader.html#getClassLoaderId()" format="html">definedClasses</xref></stentry> | |
<stentry>the classes defined by the class loader</stentry> | |
</strow> | |
<strow> | |
<stentry>Object Reference</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/ObjectReference.html#method.summary" format="html">ObjectReference</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/ObjectReference.html#getObject()" format="html">object</xref></stentry> | |
<stentry>The IObject which the reference points to</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/ObjectReference.html#getObjectId()" format="html">objectId</xref></stentry> | |
<stentry>The id of the IObject which the reference points to. This will fail for unindexed objects.</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/ObjectReference.html#getObjectAddress()" format="html">objectAddress</xref></stentry> | |
<stentry>The address of the IObject which the reference points to. This works for unindexed objects.</stentry> | |
</strow> | |
<strow> | |
<stentry>Named Reference extends ObjectReference</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/NamedReference.html#method.summary" format="html">NamedReference</xref></stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/NamedReference.html#getName()" format="html">name</xref></stentry> | |
<stentry>The field name or array index in the form <codeph>[12357]</codeph> which describes the reference.</stentry> | |
</strow> | |
</simpletable> | |
</section> | |
<section> | |
<title>Calling Java methods</title> | |
<codeblock>[ <alias> . ] @<method>( [ <expression>, <expression> ] ) ...</codeblock> | |
<p> | |
Adding ( ) forces OQL to interpret this as a Java method | |
call. The call is executed via reflection. | |
The code is executed inside Memory Analyzer on the objects in the snapshot | |
representing the heap dump. Code from the Java program which generated the dump is not | |
available and is not executed. | |
The following table lists some | |
common Java methods on the underlying Java objects used by Memory Analyzer to represent | |
objects in the heap dump. | |
</p> | |
<simpletable relcolwidth="2* 2* 2* 3*" id="method_prop"> | |
<strow> | |
<stentry>${snapshot}</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/ISnapshot.html#method.summary" format="html">ISnapshot</xref></stentry> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/ISnapshot.html#getClasses()" format="html">getClasses()</xref></codeblock> | |
</stentry> | |
<stentry>a collection of all classes</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/ISnapshot.html#getClassesByName(java.util.regex.Pattern,%20boolean)" format="html">getClassesByName(String name, boolean includeSubClasses)</xref></codeblock> | |
</stentry> | |
<stentry>a collection of classes</stentry> | |
</strow> | |
<strow> | |
<stentry>Class object</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IClass.html#method.summary" format="html">IClass</xref></stentry> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/model/IClass.html#hasSuperClass()" format="html">hasSuperClass()</xref></codeblock> | |
</stentry> | |
<stentry> | |
result is true if the class has a super class | |
</stentry> | |
</strow> | |
<strow> | |
<stentry /> | |
<stentry /> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/model/IClass.html#isArrayType()" format="html">isArrayType()</xref></codeblock> | |
</stentry> | |
<stentry> | |
the result is true if the class is an array type | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Any heap object</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#method.summary" format="html">IObject</xref></stentry> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/model/IObject.html#getObjectAddress()" format="html">getObjectAddress()</xref></codeblock> | |
</stentry> | |
<stentry> | |
The address of a snapshot object as a long integer | |
</stentry> | |
</strow> | |
<strow> | |
<stentry>Primitive array</stentry> | |
<stentry><xref href="../doc/org/eclipse/mat/snapshot/model/IPrimitiveArray.html#method.summary" format="html">IPrimitiveArray</xref></stentry> | |
<stentry> | |
<codeblock><xref href="../doc/org/eclipse/mat/snapshot/model/IPrimitiveArray.html#getValueAt(int)" format="html">getValueAt(int index)</xref></codeblock> | |
</stentry> | |
<stentry>a value from the array</stentry> | |
</strow> | |
<strow> | |
<stentry>Java primitive array, Java object array or Java list (returned from reflection)</stentry> | |
<stentry>[] or List</stentry> | |
<stentry> | |
<codeblock>get(int index)</codeblock> | |
</stentry> | |
<stentry>a value from the array or list</stentry> | |
</strow> | |
</simpletable> | |
</section> | |
<section> | |
<title>Array Access</title> | |
<p>Memory Analyzer 1.3 or later allows direct array style access of | |
primitive arrays and objects arrays from the snapshot, and Java arrays and Java Lists | |
obtained from reflective method calls. The notation is <codeph>[index]</codeph>. | |
The index is a zero-based integer. If the array is null or the index is out of range | |
then the result is null. | |
</p> | |
<p>Memory Analyzer 1.4 or later allows array range access as well using the notation | |
<codeph>[index1:index2]</codeph> where index1 and index2 are inclusive. If the values | |
are negative then they are treated as indexing from the end of the array, so -1 | |
means the last entry. This means the whole array can be accessed as a list as | |
<codeph>[0:-1]</codeph>. | |
</p> | |
</section> | |
<section> | |
<title>Reading values from primitive arrays (from the heap dump)</title> | |
<codeblock>SELECT s[2] FROM int[] s WHERE (s.@length > 2)</codeblock> | |
<p>This method is for Memory Analyzer 1.3 or later.</p> | |
<codeblock>SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2)</codeblock> | |
<p>This method is for all versions of Memory Analyzer. | |
This reads the value of the element at index 2 from all int[] arrays which have at least 3 elements. | |
</p> | |
</section> | |
<section> | |
<title>Reading objects from object arrays (from the heap dump)</title> | |
<codeblock>SELECT s[2] FROM java.lang.Object[] s WHERE (s.@length > 2)</codeblock> | |
<p>This method is for Memory Analyzer 1.3 or later. | |
<codeph>s[2]</codeph>is an IObject so fields and Java bean properties can be accessed</p> | |
<codeblock>SELECT OBJECTS s[2] FROM java.lang.Object[] s</codeblock> | |
<p>This method is for Memory Analyzer 1.3 or later. | |
The <keyword>OBJECTS</keyword> converts the object to give a tree view rather than | |
table result. We do not need the <keyword>WHERE</keyword> clause as out of range | |
accesses return null and the <keyword>OBJECTS</keyword> skips nulls.</p> | |
<codeblock>SELECT OBJECTS s.@referenceArray.get(2) FROM java.lang.Object[] s WHERE (s.@length > 2)</codeblock> | |
<p>This method is for Memory Analyzer 1.1 or later. | |
This reads as a long address the element at index 2 from all Object[] arrays which have at least 3 elements and | |
converts them into objects. | |
</p> | |
<codeblock>SELECT OBJECTS s.getReferenceArray(2,1) FROM java.lang.Object[] s WHERE (s.@length > 2)</codeblock> | |
<p>This method is for Memory Analyzer 1.1 or later. | |
This reads as an array of long[] 1 element starting at index 2 from all Object[] arrays which have at least 3 elements and | |
converts the contents of those arrays into objects. | |
</p> | |
</section> | |
<section> | |
<title>Reading from Java arrays (Memory Analyzer internal objects)</title> | |
<codeblock>SELECT s.@GCRoots[2] FROM OBJECTS ${snapshot} s</codeblock> | |
<p>This method is for Memory Analyzer 1.3 or later.</p> | |
<codeblock>SELECT s.get(2) FROM OBJECTS ${snapshot} s WHERE s.@GCRoots.@length > 2</codeblock> | |
<p>This method is for all versions of Memory Analyzer.</p> | |
</section> | |
<section> | |
<title>Reading from Java Lists (Memory Analyzer internal objects)</title> | |
<codeblock>SELECT s.@GCRoots.subList(1,3)[1] FROM OBJECTS ${snapshot} s</codeblock> | |
<p>This method is for Memory Analyzer 1.3 or later.</p> | |
<codeblock>SELECT s.@GCRoots.subList(1,3).get(1) FROM OBJECTS ${snapshot} s</codeblock> | |
<p>This method is for all versions of Memory Analyzer.</p> | |
</section> | |
<section> | |
<title>Reading subarrays</title> | |
<codeblock>SELECT s, s.count, s.offset, s.value[s.offset], | |
s.value[s.offset:((s.offset + s.count) - 1)], | |
s.value[s.offset:((s.offset + 0) - 1)], | |
s.value[0:-1].subList(s.offset,(s.offset + 0)), | |
s.value[s.offset:-1].subList(0,s.count) | |
FROM java.lang.String s</codeblock> | |
<p>This method is for Memory Analyzer 1.4 or later.</p> | |
<p>This shows how the whole array can be converted to a list using <codeph>[0:-1]</codeph> and | |
that how using array range <codeph>[offset:offset+count-1]</codeph> gives perhaps unexpected results | |
when <codeph>offset=0</codeph> and <codeph>count=0</codeph> as instead of an empty list it gives the whole array. | |
Using <codeph>subList(offset,offet+count)</codeph> once the whole array has been converted to a list | |
gives the expected result. | |
</p> | |
</section> | |
<section> | |
<title>Collection access</title> | |
<codeblock>SELECT a[0] FROM java.util.ArrayList a</codeblock> | |
<p>Many of the standard collections classes are well known by Memory Analyzer. | |
The <xref href="../tasks/analyzingjavacollectionusage.dita">collection queries</xref> | |
allow analysis of lists, sets, queues, deques and maps. | |
This access is extended to OQL so if the collection queries work with a particular | |
collection or map then so does OQL. | |
</p> | |
<note>Collection and map access is still experimental and subject to change.</note> | |
<codeblock>SELECT a[0:-1] FROM java.util.ArrayList a</codeblock> | |
<p>If the array access syntax is used on a collection (list,set, queue, deque) object | |
then particular elements of the collection can be extracted. If subarray syntax | |
is used then that part of collection is converted to a list ready for further processing</p> | |
<codeblock>SELECT h[0].@key, h[0].@value FROM java.util.HashMap h</codeblock> | |
<p>If the array access syntax is used on a map then the map is converted to a list of | |
map entries. These can then be examined using the bean access syntax to retrieve the key | |
<codeph>h[0].@key</codeph> or value <codeph>h[0].@value</codeph>. | |
See <xref format="html" scope="peer" href="http://wiki.eclipse.org/MemoryAnalyzer/OQL#Map_processing">Wiki OQL Map processing</xref> | |
for more details of OQL with maps and collections.</p> | |
</section> | |
<section> | |
<title>Built-in OQL functions</title> | |
<codeblock><function>( <parameter> )</codeblock> | |
<p>Built-in functions.</p> | |
<simpletable relcolwidth="2* 3*" id="oql_functions"> | |
<strow> | |
<stentry> | |
<codeblock>toHex( number )</codeblock> | |
</stentry> | |
<stentry>Print the number as hexadecimal</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>toString( object )</codeblock> | |
</stentry> | |
<stentry> | |
Returns the value of an object, e.g. the content | |
of a String etc. | |
</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>dominators( object )</codeblock> | |
</stentry> | |
<stentry> | |
The objects immediately dominated by the object | |
</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>outbounds( object )</codeblock> | |
</stentry> | |
<stentry>outbound referrer</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>inbounds( object )</codeblock> | |
</stentry> | |
<stentry>inbound referrer</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>classof( object )</codeblock> | |
</stentry> | |
<stentry>the class of the current object</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>dominatorof( object )</codeblock> | |
</stentry> | |
<stentry> | |
the immediate dominator, -1 if none | |
</stentry> | |
</strow> | |
<strow> | |
<stentry> | |
<codeblock>eval( expression )</codeblock> | |
</stentry> | |
<stentry> | |
(Experimental in Memory Analyzer 1.4 or later) evaluates the argument and returns it. | |
Could be useful to allow array/method access to the result of a sub-select or | |
expression. | |
</stentry> | |
</strow> | |
</simpletable> | |
</section> | |
</refbody> | |
</reference> |