OQL查询语言

SELECT Clause

The SELECT clause determines what to extract from the heap dump. To display objects and be able to browse the outgoing references, use the * symbol:

SELECT * FROM java.lang.String

Select specific columns

Alternatively, one can select the fields to be displayed:

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

The resulting table knows about the underlying object. So you can use the context menu to open further views on the object at hand. Use the @ symbol to access Java attributes and methods of the objects. There are also a number of built-in functions available to extract common information:

SELECT toString(s), s.@usedHeapSize,

s.@retainedHeapSize FROM java.lang.String s

The section on Property Accessors contains details on the commonly available attributes.

Provide column names

Use the AS keyword to name the columns:

SELECT toString(s) AS Value,

s.@usedHeapSize AS "Shallow Size",

s.@retainedHeapSize AS "Retained Size"

FROM java.lang.String s

Use the AS RETAINED SET keyword to get the set of objects retained by your selection:

SELECT AS RETAINED SET * FROM java.lang.String

Flatten select items into an object list

Use the OBJECTS to interpret the items in the SELECT clause as objects:

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

The function dominators() returns an array of objects. Therefore the query returns a list of object lists, i.e. arrays. By using the keyword OBJECTS , we force the OQL to reduce this into a single list of objects.

Select unique objects

Use the DISTINCT keyword to only select unique objects:

SELECT DISTINCT * FROM OBJECTS 0,1,1,2

Use the DISTINCT OBJECTS keyword to only select unique objects from the result of the selected clause:

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

The function classof returns the class object. Of course, all Strings have the same class. The OBJECTS converts the underlying row with a String object and a displayed value of the class object to the object represented by the result of the classof function. Without the DISTINCT OBJECTS keywords, the query would result in a list with as many rows with the same class as there are Strings.

Expressions (experimental, Memory Analyzer 1.4)

Use the expressions for the select item, including string concatenation:

SELECT s.@objectId, s.@objectId * 2, "The object ID is "+@objectId FROM OBJECTS 0,1,1,2 s

With Memory Analyzer 1.4 expressions and sub-selects are allowed for select items. More complex expressions may need to be parenthesized. This is currently in the test phase.

FROM Clause

Specify the class

The FROM clause defines the classes on which to operate. Specify the class by one of the following means:

by class name:

SELECT * FROM java.lang.String

by a regular expression matching the class name:

SELECT * FROM "java\.lang\..*"

by the object address of the class:

SELECT * FROM 0x2b7468c8

by the object addresses of more than one class:

SELECT * FROM 0x2b7468c8,0x2b74aee0

by the object id of the class:

SELECT * FROM 20815

by the object ids of more than one class:

SELECT * FROM 20815,20975

by a sub select:

SELECT * FROM ( SELECT *
                FROM java.lang.Class c
                WHERE c implements org.eclipse.mat.snapshot.model.IClass )

The statement returns all objects in the heap. The implements check is necessary, as the heap dump can contain java.lang.Class instances caused by proxy classes or classes representing primitive types such as int.class or Integer.TYPE. The following query has the same effect, which calls a method directly on the ISnapshot object:

SELECT * FROM ${snapshot}.getClasses()

Include sub classes

Use the INSTANCEOF keyword to include objects of sub-classes into the query:

SELECT * FROM INSTANCEOF java.lang.ref.Reference

The resulting table contains, amongst others, WeakReference and SoftReference objects because both classes extend from java.lang.ref.Reference . By the way, the same result has the following query

SELECT * FROM ${snapshot}.getClassesByName("java.lang.ref.Reference", true)

Prevent interpretation of the from term as classes

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:

by class name:

SELECT * FROM OBJECTS java.lang.String

The result is just one object, the java.lang.String class object.

by the object address of the particular object:

SELECT * FROM OBJECTS 0x2b7468c8

by the object addresses of particular objects:

SELECT * FROM OBJECTS 0x2b7468c8,0x2b746868

by the object id of the particular object:

SELECT * FROM OBJECTS 20815

by the object ids of particular objects:

SELECT * FROM OBJECTS 20815,20814

by a sub expression (Memory Analyzer 1.4 only):

SELECT * FROM OBJECTS (1 + ${snapshot}.GCRoots.length)

Note: Please note, that currently the FROM OBJECTS term is in the test phase!

Autocompletion

The OQL pane now has autocompletion for class names, class name regular expressions, field names, attributes and methods. See OQL autocompletion.

WHERE Clause

>=, <=, >, <, [ NOT ] LIKE, [ NOT ] IN, IMPLEMENTS (relational operations)

The WHERE clause specifies search conditions, that remove unwanted data from the query result. The following operators, are in order of precedence. The operators are evaluated in the specified order:

SELECT * FROM java.lang.String s WHERE s.count >= 100
SELECT * FROM java.lang.String s WHERE toString(s) LIKE ".*day"
SELECT * FROM java.lang.String s WHERE s.value NOT IN dominators(s)
SELECT * FROM java.lang.Class c WHERE c IMPLEMENTS org.eclipse.mat.snapshot.model.IClass

=, != (equality operations)

SELECT * FROM java.lang.String s WHERE toString(s) = "monday"

AND (conditional AND operation)

SELECT * FROM java.lang.String s WHERE s.count > 100 AND s.@retainedHeapSize > s.@usedHeapSize

OR (conditional OR operation)

SELECT * FROM java.lang.String s WHERE s.count > 1000 OR s.value.@length > 1000

Operators can be applied to expressions, constant literals and sub queries. Valid expressions are explained in the next sections.

Literal Expression

Boolean, String, Integer, Long, Character and null literals:

SELECT * FROM java.lang.String s
         WHERE ( s.count > 1000 ) = true
         WHERE toString(s) = "monday"
         WHERE dominators(s).size() = 0
         WHERE s.@retainedHeapSize > 1024L
         WHERE s.value != null AND s.value.@valueArray.@length >= 1 AND s.value.@valueArray.get(0) = 'j'
         WHERE s.@GCRootInfo != null

Property Accessors

Accessing fields of the heap object

Properties of heap objects are accessed using a simple dot notation:

[ <alias>. ] <field> . <field>. <field>

An alias can be defined in the FROM Clause 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. Fields are attributes of the Java objects in the heap dump. Use OQL autocompletion or the Object Inspector to find out about the available fields of an object.

Accessing Java Bean properties

[ <alias>. ] @<attribute> ...

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 OQL autocompletion to find the common beans names. The following table lists some commonly used Java attributes.

Any heap object

IObject

objectId

id of snapshot object

   

objectAddress

address of snapshot object

   

class

Java class of this object

   

clazz

IClass of this object. See also classof(object).

   

usedHeapSize

shallow heap size

   

retainedHeapSize

retained heap size

   

displayName

display name

Class object

IClass

classLoaderId

id of the class loader

Any array

IArray

length

length of the array

Primitive array

IPrimitiveArray

valueArray

the values in the array

Reference array

IObjectArray

referenceArray

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.

Calling Java methods

[ <alias> . ] @<method>( [ <expression>, <expression> ] ) ...

Adding ( ) forces OQL to interpret this as a Java method call. The call is executed via reflection. The following table lists some common Java methods on the underlying Java objects used by Memory Analyzer to represent objects in the heap dump.

${snapshot}

ISnapshot

getClasses()

a collection of all classes

   
getClassesByName(String name, boolean includeSubClasses)

a collection of classes

Class object

IClass

hasSuperClass()

result is true if the class has a super class

   
isArrayType()

the result is true if the class is an array type

Any heap object

IObject

getObjectAddress()

The address of a snapshot object as a long integer

Primitive array

IPrimitiveArray

getValueAt(int index)

a value from the array

Java primitive array, Java object array or Java list (returned from reflection)

[] or List

get(int index)

a value from the array or list

Array Access

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[index]. The index is a zero-based integer. If the array is null or the index is out of range then the result is null.

Memory Analyzer 1.4 allows array range access as well using the notation[index1:index2]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.

Reading values from primitive arrays

SELECT s[2] FROM int[] s WHERE (s.@length > 2)

This method is for Memory Analyzer 1.3 or later.

SELECT s.getValueAt(2) FROM int[] s WHERE (s.@length > 2)

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.

Reading objects from object arrays

SELECT s[2] FROM java.lang.Object[] s WHERE (s.@length > 2)

This method is for Memory Analyzer 1.3 or later.s[2]is an IObject so fields and Java bean properties can be accessed

SELECT OBJECTS s[2] FROM java.lang.Object[] s

This method is for Memory Analyzer 1.3 or later. The OBJECTS converts the object to give a tree view rather than table result. We do not need the WHERE clause as out of range accesses return null and the OBJECTS skips nulls.

SELECT OBJECTS s.@referenceArray.get(2) FROM java.lang.Object[] s WHERE (s.@length > 2)

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.

SELECT OBJECTS s.getReferenceArray(2,1) FROM java.lang.Object[] s WHERE (s.@length > 2)

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.

Reading from Java arrays

SELECT s.@GCRoots[2] FROM OBJECTS ${snapshot} s

This method is for Memory Analyzer 1.3 or later.

SELECT s.get(2) FROM OBJECTS ${snapshot} s  WHERE s.@GCRoots.@length > 2

This method is for all versions of Memory Analyzer.

Reading from Java Lists

SELECT s.@GCRoots.subList(1,3)[1] FROM OBJECTS ${snapshot} s

This method is for Memory Analyzer 1.3 or later.

SELECT s.@GCRoots.subList(1,3).get(1) FROM OBJECTS ${snapshot} s

This method is for all versions of Memory Analyzer.

Built-in OQL functions

<function>( <parameter> )

Built-in functions.

toHex( number )

Print the number as hexadecimal

toString( object )

Returns the value of an object, e.g. the content of a String etc.

dominators( object )

The objects immediately dominated by the object

outbounds( object )

outbound referrer

inbounds( object )

inbound referrer

classof( object )

the class of the current object

dominatorof( object )

the immediate dominator, -1 if none

eval( expression )

(Experimental in Memory Analyzer 1.4) evaluates the argument and returns it. Could be useful to allow array/method access to the result of a sub-select or expression.

BNF for the Object Query Language

SelectStatement

::=

"SELECT" SelectList FromClause ( WhereClause )? ( UnionClause )?

SelectList

::=

(( "DISTINCT" | "AS RETAINED SET" )? ( "*" | "OBJECTS" SelectItem | SelectItem ( "," SelectItem )* ))

SelectItem

::=

( PathExpression | EnvVarPathExpression ) ( "AS" ( <STRING_LITERAL> | <IDENTIFIER> ) )?

PathExpression

::=

( ObjectFacet | BuiltInFunction ) ( "." ObjectFacet | "[" SimpleExpression ( ":" SimpleExpression)? "]" )*

EnvVarPathExpression

::=

( "$" "{" <IDENTIFIER> "}" ) ( "." ObjectFacet | "[" SimpleExpression ( ":" SimpleExpression)? "]" )*

ObjectFacet

::=

( ( "@" )? <IDENTIFIER> ( ParameterList )? )

ParameterList

::=

"(" ( ( SimpleExpression ( "," SimpleExpression )* ) )? ")"

FromClause

::=

"FROM" ( "OBJECTS" )? ( "INSTANCEOF" )? ( FromItem | "(" SelectStatement ")" ) ( <IDENTIFIER> )?

FromItem

::=

( ClassName | <STRING_LITERAL> | ObjectAddress ( "," ObjectAddress )* | ObjectId ( "," ObjectId )* | EnvVarPathExpression )

ClassName

::=

( <IDENTIFIER> ( "." <IDENTIFIER> )* ( "[]" )* )

ObjectAddress

::=

<HEX_LITERAL>

ObjectId

::=

<INTEGER_LITERAL>

WhereClause

::=

"WHERE" ConditionalOrExpression

ConditionalOrExpression

::=

ConditionalAndExpression ( "or" ConditionalAndExpression )*

ConditionalAndExpression

::=

EqualityExpression ( "and" EqualityExpression )*

EqualityExpression

::=

RelationalExpression ( ( "=" RelationalExpression | "!=" RelationalExpression ) )*

RelationalExpression

::=

( SimpleExpression ( ( "<" SimpleExpression | ">" SimpleExpression | "<=" SimpleExpression | ">=" SimpleExpression | ( LikeClause | InClause ) | "implements" ClassName ) )? )

LikeClause

::=

( "NOT" )? "LIKE" <STRING_LITERAL>

InClause

::=

( "NOT" )? "IN" SimpleExpression

SimpleExpression

::=

MultiplicativeExpression ( "+" MultiplicativeExpression | "-" MultiplicativeExpression )*

MultiplicativeExpression

::=

PrimaryExpression ( "*" PrimaryExpression | "/" PrimaryExpression )*

PrimaryExpression

::=

Literal

|

"(" ( ConditionalOrExpression | SubQuery ) ")

|

PathExpression

|

EnvVarPathExpression

SubQuery

::=

SelectStatement

Function

::=

( ( "toHex" | "toString" | "dominators" | "outbounds" | "inbounds" | "classof" | "dominatorof" ) "(" ConditionalOrExpression ")" )

Literal

::=

( <INTEGER_LITERAL> | <LONG_LITERAL> | <FLOATING_POINT_LITERAL> | <CHARACTER_LITERAL> | <STRING_LITERAL> | BooleanLiteral | NullLiteral )

BooleanLiteral

::=

"true"

|

"false"

NullLiteral

::=

<NULL>

UnionClause

::=

( "UNION" "(" SelectStatement ")" )+

转载于:https://www.cnblogs.com/GarfieldEr007/p/9942624.html

JVM OQL查询语言相关推荐

  1. Java虚拟机性能监测工具Visual VM与OQL对象查询语言

    1.Visual VM多合一工具 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具,它集成了多种性能统计工具的功能,使用 Visual VM 可以代替jstat.jmap.jha ...

  2. 内存泄漏排查攻略之:Show me your Memory

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源| cnblogs.com/yougewe/p/11334342.html java 语言有个神奇的地方,那就是你时不时会去 ...

  3. 【web安全】Spring boot heapdump获取敏感信息

    一.概述 微服务是目前较为热门的技术,Spring boot 是 Spring 的一套快速配置脚手架,可以基于Spring boot 快速开发单个微服务,微服务的特点决定了功能模块分布式部署,在不同的 ...

  4. Java 堆内存分析

    Java 堆内存工具jmap 打印当前 Java 堆内存信息 jmap -histo[:live] <pid> # 打印当前进程中类实例信息 导出Java 堆内存到文件 jmap -dum ...

  5. netty数据流堆外内存排查

    背景 行情服务每次在开盘与收盘期间的堆外内存都会上涨,并且需要周期性手动重启,影响到服务的稳定性 排查过程 1.堆外内存的计算标准 此matrix(used_direct_memory)计算标准由ne ...

  6. jhat命令分析java heapdump信息实战

    前言: 很多时候,我们需要分析下当前进程的内存使用情况(OOM等异常). 一般,我们会先使用命令打印出一个heap dump文件(文件会比较大),然后使用命令或工具来分析占用内存比较大的对象. 命令的 ...

  7. jhat中的OQL(对象查询语言)

    jhat中的OQL(对象查询语言) 如果需要根据某些条件来过滤或查询堆的对象,这是可能的,可以在jhat的html页面中执行OQL,来查询符合条件的对象 基本语法: select <javasc ...

  8. ORM查询语言(OQL)简介--概念篇

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  9. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解

    来自:ITeye博客, 作者:Josh_Persistence 链接:https://www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发 ...

最新文章

  1. 买得嗨更要聊得嗨 阿里通免费电话惠战双11
  2. mysql的crud语句_MySQL数据库CRUD语句快速入门
  3. Android ANR异常及解决方法
  4. jquery对select的操作详解
  5. centos linux编译c,紧急提醒!Linux是如何编译C语言程序文件的?CentOS 8的gcc使用方法介绍...
  6. DL:深度学习(神经网络)的简介、基础知识(神经元/感知机、训练策略、预测原理)、算法分类、经典案例应用之详细攻略
  7. HDU 4630 No Pain No Game 树状数组+离线操作
  8. C语言科技感图片,科技感与运动范十足,几何C黑棚图曝出,年轻消费者又多了新选择...
  9. 【渝粤教育】国家开放大学2018年春季 0341-21T高级英语听力(2) 参考试题
  10. spring学习(27):通过setter依赖注入
  11. jquery交换数组元素位置_跟我一起学jQuery——第一集
  12. mysql datatype 类型_MySQL DataType--数值类型
  13. 自动驾驶——localization的学习笔记
  14. uva live 4394 String painter 区间dp
  15. arduino连接ps2手柄控制智能小车实践记录-续
  16. 港科夜闻丨香港科大教授权龙:三维重建才是计算机视觉的灵魂
  17. Win7开自带的虚拟WIFI
  18. Dropout 和 keep_prob
  19. 安卓移动开发实验:Android Studio设计微信界面
  20. python 浏览器 弹 另存为_另存为弹出框如何调用

热门文章

  1. 压缩信息立方体和集合技术内幕
  2. Spring+SpringMVC+MyBatis+easyUI整合基础篇(四)代码简化
  3. Java日志性能那些事
  4. [转]expect的安装
  5. SAP 主数据-地点表
  6. android Integer类的toString函数的使用
  7. android系统内置HttpClient库(WebView+ Http(s)URLConnection(ok-http)+ HttpClient(apache-http))
  8. jeesite3环境部署时初始化数据库注意问题
  9. Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题
  10. 多重for循环如何提速