As I mentioned earlier, Mustang (Java SE 6) comes with jhat - Java Heap Analysis Tool. We have added more features to jhat as of build 53 (released on Sep, 22, 2005). jhat now comes with mechanism to query the heap. jhat supports OQL - Object Query Language -- a SQL-like language to query your Java heap! HAT always supported simple queries such as "show all instances of class X" (include subclasses or not), "show all referrers to a specific object", "show all objects reachable from a specific object" etc. But, these pre-defined queries (supported by hyperlinks) may always be sufficient to a specific problem in your hand. That is where OQL helps.
OQL query is of the form
select <expression>
[ from [instanceof] <class name> <identifier>
[ where <filter-expression> ] ]
where select, from, where, instanceof are keywords. expression, filter-expression are JavaScript expressions. class name is fully qualified Java class name (example: java.net.URL) or array class name. [C is char array name, [Ljava.io.File; is name of java.io.File[] and so on. If instanceof keyword is used, subtype objects are selected. If this keyword is not specified, only the instances of exact class specified are selected. Both from and where clauses are optional.
In select and (optional) where clauses, the expression used in JavaScript expression. Java heap objects are wrapped as convenient script objects so that fields may be accessed in natural syntax. For example, Java fields can be accessed with obj.field_name syntax and array elements can be accessed with array[index] syntax. Each Java object selected is bound to a JavaScript variable of the identifier name specified in from clause.
identifier is a name bound for each Java heap object that is matching from and where clause. Note that both from and where clauses are optional. Few simple examples, would help in understanding basic OQL.
select s from java.lang.String s
where s.count > 100
select a from [I a where a.length >= 256
select classof(cl).name
from instanceof java.lang.ClassLoader cl
This is so cool...
If I want to display a socket's address, how
do I do that? E.g. I can use "sock.impl.address.address" which returns an integer. I'd like to format that into a dotted
a.b.c.d notation. How can I do that?
I guess I could write a function literal for this,
but can I add to the library of builtin functions?
Thank's
it is not reproducible in our box. I am looking for tool through with i can dirctly look in to client java heap for perticular object or perticular thread object on live runtime see what the state of object.
If so, anyone can use it for production tuning, which would be awesome.